2017-01-09 86 views
0

我開發了一個類,我需要我的對象能夠保存程序生命週期中發生的事件的「歷史記錄」。對象初始化的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

如果發生異常,它就會發生。當然你可以做點什麼。但它不應該發生在類的構造函數內部,當然也不在類的析構函數中。 –

回答

2

1)類的構造函數是通過執行該類的單元的初始化部分執行的 - 準確地說:緊接在初始化部分的代碼之前。對於析構函數來說,它是相反的。單元的初始化順序由編譯器決定。

與初始化/終結部分代碼的區別在於,只有在程序中實際使用類時才執行類構造函數/析構函數。

2)只要類析構函數被調用,就不會得到內存泄漏(至少不會從這個字符串列表中)。

相關問題