用于对象初始化的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),我仍然可以访问字符串列表。 我有两个关于类构造函数和析构函数的问题。

  • 该文档说构造函数被编译器自动插入初始化部分。 相反的情况发生在析构函数中。 这是否意味着如果我调用var a: TPipelineSimulator; 在按钮的onclick过程中,程序启动时会调用a的类构造函数吗? 或者当我第一次致电该程序时?

  • 如果发生异常(可能是我错误地超出了字符串列表的范围),我是否有内存泄漏的风险?

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

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

    尽管如此,我仍然可以访问字符串列表,而且我真的想知道这段代码是否危险。


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

    与初始化/终结部分代码的区别在于,只有在程序内部实际使用类时才执行类构造函数/析构函数。

    2)只要类析构函数被调用,就不会发生内存泄漏(至少不会从该字符串列表中获取)。

    链接地址: http://www.djcxy.com/p/60261.html

    上一篇: Delphi class constructor for object initialization

    下一篇: OOP and inheritance of private fields