我已经开发了一个课程,我需要我的对象能够保持"历史"在该计划的整个生命周期中发生的事情。
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。我有两个关于类构造函数和析构函数的问题。
documentation表示编译器会自动将构造函数插入初始化部分。与析构函数相反。这是否意味着如果我在按钮onclick过程中调用var a: TPipelineSimulator;
,程序启动时会调用a
的类构造函数?或者就在我第一次打电话给这个程序的时候?
如果出现异常(可能是因为我在字符串列表中超出界限),我是否会冒内存泄漏的风险?
在第2点我的意思是这样的。如果StringList每次都填充1个项目,则在下面的代码开始时会导致几次出界错误:
showmessage(a.history.strings[10]);
尽管我仍然可以访问stringlist,但我真的很想知道这段代码是否有危险。
答案 0 :(得分:2)
1)类构造函数使用实现类的单元的初始化部分执行 - 确切地说:紧接在初始化部分中的代码之前。对于析构函数,它是相反的。单元的初始化顺序由编译器确定。
初始化/完成部分代码的不同之处在于,只有在程序中实际使用该类时,才会执行类构造函数/析构函数。
2)只要调用类析构函数,就不会出现内存泄漏(至少不会出现此字符串列表)。