首页 文章

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

提问于
浏览
0

我已经开发了一个类,我需要我的对象能够保存程序生命周期中发生的事情的“历史” .

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 变量;通过这种方式,我可以填充我的stringlist并使用以下代码访问它:

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

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

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

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

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

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

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

1 回答

  • 2

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

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

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

相关问题