请教大虾们一个问题,昨天看了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 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中测试,运行的时候并没有出现什么错误提示,不知道是我理解错了还是什么原因,请大虾们帮忙解答。
begin
if Self <> nil then
Destroy;
end;
我一般只用这个,,
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;
试一下这个代码你就能看出结果。
9 strlist.free;
?
顺序反了吧?