对象初始化的Delphi类构造函数
问题描述:
我开发了一个类,我需要我的对象能够保存程序生命周期中发生的事件的“历史记录”。对象初始化的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
可变正常程序(未类程序);通过这种方式,我可以填补我的StringList和使用此代码访问它:
for k := 0 to a.history.Count-1 do
Memo1.Lines.Add(a.history.Strings[k]);
这是非常有用的,因为即使是创建对象,然后释放(平时Free
内尝试,终于)我仍然可以访问字符串列表。我有两个关于类构造函数和析构函数的问题。
的documentation说,构造函数由编译器进入初始化部分自动插入。相反的情况发生在析构函数中。这是否意味着如果我在按钮onclick过程中调用
var a: TPipelineSimulator;
,程序启动时将调用a
的类构造函数?或者当我第一次致电该程序时?如果发生异常(可能是我错误地超出了字符串列表的范围),是否会冒内存泄漏的风险?
在第2点,我的意思是这样的。如果StringList的充满每次1个项目,在开始下面的代码会导致出界错误几次:
showmessage(a.history.strings[10]);
尽管如此,我仍然可以访问的StringList,我真的不知道如果这个代码是危险的。
答
1)类的构造函数是通过执行该类的单元的初始化部分执行的 - 准确地说:紧接在初始化部分的代码之前。对于析构函数来说,它是相反的。单元的初始化顺序由编译器决定。
与初始化/终结部分代码的区别在于,只有在程序中实际使用类时才执行类构造函数/析构函数。
2)只要类析构函数被调用,就不会得到内存泄漏(至少不会从这个字符串列表中)。
关于越界错误的毫无意义的推理。只需修复它们。您的代码已损坏。谁在乎在这种情况下是否泄漏?你给了更大的问题。至于在初始化和定稿过程中的例外,这不应该发生。你必须确保它没有。如果是这样,那么你不能恢复,所以再次泄漏不是你的担心。游戏结束了。 –
所以你告诉我,如果一生中发生异常,我什么都不能做? (因为当然,析构函数不像通常的正常构造函数/析构函数那样自动调用) –
如果发生异常,它就会发生。当然你可以做点什么。但它不应该发生在类的构造函数内部,当然也不在类的析构函数中。 –