请教关于匿名对象的生存期的问题。 (30分)

  • 主题发起人 主题发起人 huanzhugege
  • 开始时间 开始时间
H

huanzhugege

Unregistered / Unconfirmed
GUEST, unregistred user!
with TTimer.Create(nil) do
begin
//do something
end;


with TTimer.Create(self) do
begin
//do something
end;
上面这两段代码会造成内存泄露吗?如果不会,这个匿名对象是在什么时候被销毁的?

 
with TTimer.Create(self) do
begin
//do something
free;
end;

这样释放 否则第一个在application时释放 第二个在窗体free的时候释放。
 

这样写
with TTimer.Create(nil) do
try
//do something
finally
Free;
end;

或者
with TTimer.Create(self) do
begin
//do something。不要去释放这个匿名对象,
//它的生命期 交给self来管理了
end;

 
with TTimer.Create(nil) do一定要释放
with TTimer.Create(self) do可以释放也可以不释放
 
內存泄露是不會的.
其實 Object := TObject.Create(Owner)
Object相當於一個指針
Object在內存的生存期依賴於Owner,只要Owner.Free Object是一定要Free.

nil相當於Appliction 就是要等到應用程序退出.
 
如果程序发生异常或错误的话,很遗憾会发生问题,为什么不尝试用
Try
YourObject.create(nil/Owner);
YourObject.doSomething
finally
YourObject.free;
end;
祝好运!
 
with TTimer.Create(nil) do
begin
//do something
end;
//参数nil表示对象在创建时并没指明创建对象的所有者,所以以这方式创建的对象必须手工释放, 否则会造成内存泄露.

with TTimer.Create(self) do
begin
//do something
end;
//参数self指明了被创建对象的所有者,也就是说Timer的生命期由对象self(这里self应该指窗体)来管理,窗体要销毁时它首先会通知Timer,只到窗体中所有地对象都销毁了,窗体才会销毁.因此这里不会有内存泄露.
 
后退
顶部