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

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

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

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

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

尽管如此,我仍然可以访问的StringList,我真的不知道如果这个代码是危险的。

+0

关于越界错误的毫无意义的推理。只需修复它们。您的代码已损坏。谁在乎在这种情况下是否泄漏?你给了更大的问题。至于在初始化和定稿过程中的例外,这不应该发生。你必须确保它没有。如果是这样,那么你不能恢复,所以再次泄漏不是你的担心。游戏结束了。 –

+0

所以你告诉我,如果一生中发生异常,我什么都不能做? (因为当然,析构函数不像通常的正常构造函数/析构函数那样自动调用) –

+0

如果发生异常,它就会发生。当然你可以做点什么。但它不应该发生在类的构造函数内部,当然也不在类的析构函数中。 –

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

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

2)只要类析构函数被调用,就不会得到内存泄漏(至少不会从这个字符串列表中)。