用于对象初始化的Delphi类构造函数

时间:2017-01-09 22:21:33

标签: delphi

我已经开发了一个课程,我需要我的对象能够保持"历史"在该计划的整个生命周期中发生的事情。

type
 TPipelineSimulator = class
  private
   class var history: TStringList;
   class constructor Create;
   class destructor Destroy;
   //other code
  public
   class property bitHistory: TStringList read history;
   //other code
 end;

简单的实现是:

class constructor TPipelineSimulator.Create;
begin
 history := TStringList.Create;
end;

class destructor TPipelineSimulator.Destroy;
begin
 history.Free;
end;

TPipelineSimulator有一个正常的过程(不是类过程),它将字符串添加到history变量;通过这种方式,我可以填写我的字符串列表并使用以下代码访问它:

for k := 0 to a.history.Count-1 do
  Memo1.Lines.Add(a.history.Strings[k]);

这非常有用,因为即使创建然后释放了对象(通常Free里面的try-finally),我仍然可以访问stringlist。我有两个关于类构造函数和析构函数的问题。

  1. documentation表示编译器会自动将构造函数插入初始化部分。与析构函数相反。这是否意味着如果我在按钮onclick过程中调用var a: TPipelineSimulator;,程序启动时会调用a的类构造函数?或者就在我第一次打电话给这个程序的时候?

  2. 如果出现异常(可能是因为我在字符串列表中超出界限),我是否会冒内存泄漏的风险?

  3. 在第2点我的意思是这样的。如果StringList每次都填充1个项目,则在下面的代码开始时会导致几次出界错误:

    showmessage(a.history.strings[10]);
    

    尽管我仍然可以访问stringlist,但我真的很想知道这段代码是否有危险。

1 个答案:

答案 0 :(得分:2)

1)类构造函数使用实现类的单元的初始化部分执行 - 确切地说:紧接在初始化部分中的代码之前。对于析构函数,它是相反的。单元的初始化顺序由编译器确定。

初始化/完成部分代码的不同之处在于,只有在程序中实际使用该类时,才会执行类构造函数/析构函数。

2)只要调用类析构函数,就不会出现内存泄漏(至少不会出现此字符串列表)。