在程序某处创建了一个TStringList对象:
rfLstURL:=TStringList.Create;现在想实现这样的目的,当rfLstURL已经释放,则不处理,否则,释放:
  if rfLstURL<>nil then rfLstURL.Free;
但上面的代码在rfLstURL已经释放仍会报内存错误?

解决方案 »

  1.   

    if rfLstURL <>nil then freeandnil(rfLstURL); 
      

  2.   


    if Assigned(rfLstURL) Then FreeAndNil(rfLstURL); 
      

  3.   

    if rfLstURL <>nil then rfLstURL.Free; 
    这里判断没有什么用的!对象的Free方法本来就会判断对象是不是nil的!你在所有释放rfLstURL时不要调用rfLstURL.Free;而要这样
    FreeAndNil(rfLstURL) <==> rfLstURL.Free;rfLstURL := nil;
    这样就不会出错了
      

  4.   

    if Assigned(rfLstURL) then
        FreeAndNil(rfLstURL);
      

  5.   

    里的判断也可以不要,因为Free自己也会判断的!看Delphi的System代码的代码片断procedure TObject.Free;
    begin
      if Self <> nil then
        Destroy;
    end;
      

  6.   

    楼上的,一样的会报内存错误。
    如果我已经在别的地方Free了,就会报内存错误。
      

  7.   


    楼主你没弄清楚,rfLstURL你可以理解为是个指针,指向一个Tstringlist对象
    对象有没有free有没有create,与rfLstURL这个指针是否为nil没有任何关系.你声明了rfLstURL,rfLstURL就不是nil,除非你手动把它赋值为nil.如果你想用rfLstURL是否为nil来判断rfLstURL的对象是否存在的话,你必须做到:
    1.rfLstURL声明后,create之前,要rfLstURL:=nil;
    2.free之后也要rfLstURL:=nil;而freeandnil(rfLstURL)这个函数就相当于:
    rfLstURL.free;
    rfLstURL:=nil;
      

  8.   

    如果我所有地方都用FreeAndNil,则可以通过Assigned或<>nil来判断;
    但是如果我之前用的是Free,则用上面两种办法都会报错;
    即:FreeAndNil(rfLstURL);
    if rfLstURL<>Nil then FreeAndNil(rfLstURL);
    if assigned(rfLstURL) then  FreeAndNil(rfLstURL);
    都可以。但:
    frLstURL.Free;
    if rfLstURL<>Nil then FreeAndNil(rfLstURL);
    if assigned(rfLstURL) then  FreeAndNil(rfLstURL);
    都会报内存错误。
      

  9.   

    我的问题解决了,感谢更位,但我还有点不明白,如何判断一个通过Create创建的对象已经不存了?
      

  10.   

    又向blazingfire 学东西了:)
      

  11.   

    如果在判断之前仅用Free将对象实体释放了,而对象指针没有置为Nil,
    我认为不好判断!