关于TStringList的释放(100分)

  • 主题发起人 longsheng
  • 开始时间
L

longsheng

Unregistered / Unconfirmed
GUEST, unregistred user!
我在MyStringList: TStringList中用AddObject('',MyObject)加入了自定义的对象MyObject: TMyObject;在释放TStringList时,需要先释放对象MyObject,于是我在MyStringList的Destroy事件中填加了如下代码:
var
nMyObject: TMyObject;
begin
for i:= 0 to MyStringList.Count - 1 do
begin
nMyObject:=TMyObject(MyStringList.Objects[0])
nMyObject.free;
MyStringList.delete(0);
end;

inherited;
end;

请问:
是先运行nMyObject.free; 再运行MyStringList.delete(0); 好?还是先运行MyStringList.delete(0); 再运行nMyObject.free; 好?
先Free再Delete或先Delete再Free,他们有什么隐患?请各位高手指教!
谢谢!!!
 
无所谓,delete 并不是释放什么对象,跟另一个对象的 free 没有关系。
 
呵呵,只要你记得Delete和Free都做了,就无所谓先后了。
不过,如果你nMyObject.free以后,这时用MyStringList.Objects[0]<>NIL
或Assigned(MyStringList.Objects[0])都不能检测出nMyObject是否有效,所
以要小心一点.
 
当然先 free 再 delete.

btw: 从后往前, 要不肯定出错.
 
从后往前,你的循环最好这样
for i := MyStringList.Count - 1 downto 0 do
begin
...
end;
 
好像用clear更好一些把
 
呵呵,小伙子做得不错:
你做得非常正确,要记住,Stringlist只是把对象的指针加
到了列表中去,当然最好是先free再delete.
在你的例子中正如crab所说,次序是无所谓的,但如果是下面的
写法就要注意次序了:
for i:= 0 to MyStringList.Count - 1 do begin
(TMyObject(MyStringList.Objects[0])).free
MyStringList.delete(0);
end
 
我常用的方法:

while MyStringList.Count > 0 do begin
nMyObject(MyStringList.Items[0]).free;
MyStringList.delete(0);
end;
 
补充两句:
一般说来手工创建的对象应该手工删除,这是避免系统崩溃的不二法宝;
在删除对象的引用之前首先删除对象,即先free,后delete,否则会造成内存垃圾,
因为你无法释放这块内存了。但在你的程序中,为对象提供了一个新的引用,则先后
就无所谓了。
但是应该注意,为即将删除的对象增加一个新的引用并不是好办法,因为free后,
这个指针就是“悬空”的,如果不小心在后续的语句中再使用这个引用,会造成意想
不到的错误。
另外也可以在删除所有的关联对象后一次清空列表,clear。为了避免指针悬空,
在free后,应该将引用置为空。
for i:= 0 to MyStringList.Count - 1 do begin
(TMyObject(MyStringList.Objects[0])).free
MyStringList.Objects[0]:=nil;
end
mystringlist.clear;
 
最好再加上
try
..
except
//
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
979
SUNSTONE的Delphi笔记
S
S
回复
0
查看
799
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部