【求助】关于Delphi对象创建与释放的简单问题(100分)

  • 主题发起人 主题发起人 叮叮当当
  • 开始时间 开始时间

叮叮当当

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
T: array of TStringList;
i: Integer;
begin
SetLength(T, 100);
for i:=0 to High(T) do
begin
T := TStringList.Create;
T.Add(inttostr(i));
T.Free;
end;
SetLength(T, 0);
T := nil;
end;

这是对象的创建与释放问题。这样写会不会有内存泄漏?
T.Free后是不是还要加上T := nil?或者用FreeAndNil(T)代替T.Free?
同理,对于T的释放呢?
 
FreeAndNil函数和.Free方法是否等价呢?还是和.Free方法加上赋nil值等价呢?
 
这样应该不会有内存泄漏了,因为T.Free之后,实际上的T只是无效指针了;
但是如果不写T.Free就会造成内存泄漏。

看看freeandnil的源代码:
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;

实际上就是释放掉,然后将对象赋值成nil,这样可以防止错误使用已经释放的对象。

好像没什么可说的了,呵呵!
 
建议你加上异常处理:
for i:=0 to High(T) do
begin
try
T := TStringList.Create;
T.Add(inttostr(i));
finally
T.Free;
end;
Create叫创建对象的实例,因为必须创建它才能使用该类的特性和方法。Create是构造
函数。而析构函数是Destroy,而Destroy并不知道对象是否灬空,Free呢,它选检查对
象是否为空值,然后调用Destroy方法。FreeAndNil和Free是很类似的,它是选调用对象
的Free方法然后将实例赋值为Ni。
一般用Free就可以了。
 
是不是需要设置为nil和内存泄漏无关,有些全局变量设置为nil只是为了自己方便在其他地方知道这个对象是否已经释放
见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1026926
 
应该加上异常处理
 
加个异常处理,然后使用循环一个个释放.
 
谢谢大家![:)]
 
后退
顶部