我開發了一個類,我需要我的對象能夠保存程序生命週期中發生的事件的「歷史記錄」。對象初始化的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,我真的不知道如果這個代碼是危險的。
關於越界錯誤的毫無意義的推理。只需修復它們。您的代碼已損壞。誰在乎在這種情況下是否泄漏?你給了更大的問題。至於在初始化和定稿過程中的例外,這不應該發生。你必須確保它沒有。如果是這樣,那麼你不能恢復,所以再次泄漏不是你的擔心。遊戲結束了。 –
所以你告訴我,如果一生中發生異常,我什麼都不能做? (因爲當然,析構函數不像通常的正常構造函數/析構函數那樣自動調用) –
如果發生異常,它就會發生。當然你可以做點什麼。但它不應該發生在類的構造函數內部,當然也不在類的析構函數中。 –