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