在DELPHI中,对象生命周期有一个铁原则,谁创建谁销毁。(
不像JAVA和。NET有自动垃圾回收机制,事实上即使有这种机制也要遵循这个原则)
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
我在此举两个方面的例子,一个是全局对象引用,局部对象引用;
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
全局对象指的是作用域较大的引用,通常在一个类中会引用某个对象做为成员使用,这时就会有对象生命周期管理了。通常我们会将对象申明在privte域内,在构造函数中创建它,此时的创建者是这个类,所以就必须由这个类来负责销毁对象。下面举个代码例子:
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
TWork = class
®"À¬?µwww.mini188.com8Ê[CòF«
private
®"À¬?µwww.mini188.com8Ê[CòF«
Data: TAdoQuery;
®"À¬?µwww.mini188.com8Ê[CòF«
public
®"À¬?µwww.mini188.com8Ê[CòF«
constructor Create;
®"À¬?µwww.mini188.com8Ê[CòF«
destructor Destroy; override;
®"À¬?µwww.mini188.com8Ê[CòF«
end;
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
constructor TWork.Create;
®"À¬?µwww.mini188.com8Ê[CòF«
begin
®"À¬?µwww.mini188.com8Ê[CòF«
Data := TADOQuery.Create(nil);
®"À¬?µwww.mini188.com8Ê[CòF«
end;
®"À¬?µwww.mini188.com8Ê[CòF«
destructor TWorkRecord.Destroy;
®"À¬?µwww.mini188.com8Ê[CòF«
begin
®"À¬?µwww.mini188.com8Ê[CòF«
if Assigned(Data) then FreeAndNil(Data);
®"À¬?µwww.mini188.com8Ê[CòF«
inherited;
®"À¬?µwww.mini188.com8Ê[CòF«
end;
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
在上述代码中,对象Data在TWork创建时就被创建,作为Data的创建者,它必须保证自己死亡时Data在它之前先死,所以在析构函数中将其Free掉。这样就[完整的管理了Data对象的生命周期.
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
局部对象用得相对要多一些,而且局部分对象一般都是马上创建——》使用——》销毁。随着作用域的关闭,局部对象也是要销毁的。下面也举一个代码例子:
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
procedure TForm1.HelloWord;
®"À¬?µwww.mini188.com8Ê[CòF«
var
®"À¬?µwww.mini188.com8Ê[CòF«
vQry1,vQry2: TADOQuery;
®"À¬?µwww.mini188.com8Ê[CòF«
begin
®"À¬?µwww.mini188.com8Ê[CòF«
vQry1 := TADOQuery.Create(Self);
®"À¬?µwww.mini188.com8Ê[CòF«
try
®"À¬?µwww.mini188.com8Ê[CòF«
....
®"À¬?µwww.mini188.com8Ê[CòF«
vQry2 := TADOQuery.Create(Self);
®"À¬?µwww.mini188.com8Ê[CòF«
try
®"À¬?µwww.mini188.com8Ê[CòF«
......
®"À¬?µwww.mini188.com8Ê[CòF«
finally
®"À¬?µwww.mini188.com8Ê[CòF«
FreeAndNil(vQry2);
®"À¬?µwww.mini188.com8Ê[CòF«
end;
®"À¬?µwww.mini188.com8Ê[CòF«
finally
®"À¬?µwww.mini188.com8Ê[CòF«
FreeAndNil(vQry1);
®"À¬?µwww.mini188.com8Ê[CòF«
end;
®"À¬?µwww.mini188.com8Ê[CòF«
end;
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
在一个方法中申明并使用了两个对象,分别创建后马上使用他们,并在使用完后Free掉了。。
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
此时为了管理生命周期,使用了try finnally来处理,这一点很重要,在局部对象生命周期管理中,try..finnally可以保证对象可以安全创建并销毁。这样就不会造成内存泻漏了。。
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
®"À¬?µwww.mini188.com8Ê[CòF«
还有很多情况,这里就不一一说了,实际情况实际解决。。
®"À¬?µwww.mini188.com8Ê[CòF«