迷你5207专属论坛

注册

 

发新话题 回复该主题

[设计] [DELPHI]对象生命期管理 [复制链接]

发表者
在DELPHI中,对象生命周期有一个铁原则,谁创建谁销毁。(不像JAVA和。NET有自动垃圾回收机制,事实上即使有这种机制也要遵循这个原则) 我在此举两个方面的例子,一个是全局对象引用,局部对象引用; 全局对象指的是作用域较大的引用,通常在一个类中会引用某个对象做为成员使用,这时就会有对象生命周期管理了。通常我们会将对象申明在privte域内,在构造函数中创建它,此时的创建者是这个类,所以就必须由这个类来负责销毁对象。下面举个代码例子:
  1. TWork = class
  2. private
  3.     Data: TAdoQuery;
  4. public
  5.     constructor Create;
  6.     destructor Destroy; override;
  7. end;

  8. constructor TWork.Create;
  9. begin
  10.   Data := TADOQuery.Create(nil);
  11. end;
  12. destructor TWorkRecord.Destroy;
  13. begin
  14.   if Assigned(Data) then FreeAndNil(Data);
  15.   inherited;
  16. end;
复制代码
在上述代码中,对象Data在TWork创建时就被创建,作为Data的创建者,它必须保证自己死亡时Data在它之前先死,所以在析构函数中将其Free掉。这样就[完整的管理了Data对象的生命周期. 局部对象用得相对要多一些,而且局部分对象一般都是马上创建——》使用——》销毁。随着作用域的关闭,局部对象也是要销毁的。下面也举一个代码例子:
  1. procedure TForm1.HelloWord;
  2. var
  3.   vQry1,vQry2: TADOQuery;
  4. begin
  5.    vQry1 := TADOQuery.Create(Self);
  6.   try
  7.    ....
  8.       vQry2 := TADOQuery.Create(Self);
  9.       try
  10.         ......
  11.       finally
  12.         FreeAndNil(vQry2);
  13.       end;
  14.   finally
  15.     FreeAndNil(vQry1);
  16.   end;
  17. end;
复制代码
在一个方法中申明并使用了两个对象,分别创建后马上使用他们,并在使用完后Free掉了。。 此时为了管理生命周期,使用了try finnally来处理,这一点很重要,在局部对象生命周期管理中,try..finnally可以保证对象可以安全创建并销毁。这样就不会造成内存泻漏了。。 还有很多情况,这里就不一一说了,实际情况实际解决。。
本主题由 皇帝 5207 于 2009-7-3 23:07:56 执行 主题分类 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
发新话题 回复该主题