我已经开发了一个类,我需要我的对象能够保存程序生命周期中发生的事情的“历史” .
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 回答
1)类构造函数使用实现类的单元的初始化部分执行 - 准确地说:紧接在初始化部分中的代码之前 . 对于析构函数,它是相反的 . 单元的初始化顺序由编译器确定 .
初始化/最终化部分代码的不同之处在于,只有在程序内实际使用该类时,才会执行类构造函数/析构函数 .
2)只要调用类析构函数,就不会出现内存泄漏(至少不会出现此字符串列表) .