请教大虾们一个问题,昨天看了delphi中的指针的free和nil,有个问题请大家帮我解答:
1   var
2   strlist:TStringList;//定义一个TStringList
3   begin
4   strlist:=tstringlist.create;
5   strlist.loadfromfile('abc.txt');
6   .......       //使用strlist
7
8   strlist:=nil;     //用完之后释放掉
9   strlist.free;
10  end;照我的理解,第8行是把strlist指针置为空,第9行是吧strlist指向的地址空间释放,按上面代码的顺序,先把指针赋为nil,再释放指针指向的地址空间,程序应该是会出错的,不过,上面的代码我自己在d7中测试,运行的时候并没有出现什么错误提示,不知道是我理解错了还是什么原因,请大虾们帮忙解答。

解决方案 »

  1.   

    看看Free的源代码procedure TObject.Free;
    begin
      if Self <> nil then
        Destroy;
    end;
      

  2.   

    strlist.free;
    我一般只用这个,,
      

  3.   

    1L正解,free和destroy的区别就在这里了
      

  4.   

    8 strlist:=nil; //用完之后释放掉
    9 strlist.free;这么写代码不报AV错误?nil是一个指针数据类型值,表示空指针;你这儿 strlist 是一个对象引用(可看作是Delphi中对象实例的指针),你如果直接把 strlist 赋值为nil,这个操作就是表示你让一个对象引用失效,因为nil表示不指针向任何对象实例;第9行代码,你通过对象引用来调用对象实例的free方法,调用free方法,确实如1楼所说,会调用对象的析构方法,从而回收对象占用的系统资源;但如果先执行 第 8 行,再执行第9 行,实际上应当无法正确释放strlist占用的系统资源了。但奇怪的是上面的代码运行却并不报错。呵~~,这个确实是让我费解了。
    var
       strlist:TStringList;
    begin
       strlist := tstringlist.Create;
       try
         strlist.Add('test');
         ShowMessage( strlist.Strings[0] );
         strlist := nil;
         ShowMessage( strlist.Strings[0] );
         strlist.Free;
       except   end;
    end;
    试一下这个代码你就能看出结果。
      

  5.   

    大概能猜出原因,不过因为是猜想身边没有delphi环境,不敢胡说,回家研究下源代码的说~
      

  6.   

    这么写,第9行是无效的,执行Free之前是要判断是不是nil的
      

  7.   

    加上 FastMM ,你再试试看
      

  8.   

    8 strlist:=nil; //用完之后释放掉
    9 strlist.free;

    顺序反了吧?