2012-03-17 59 views
10

我已經添加了一些代碼到我的delphi項目來與註冊表進行交互,使用我在網上找到的一些教程來指導我的努力。我見過的每一個例子似乎用這種結構爲他們的註冊表訪問:德爾福變量可能沒有初始化警告

var 
    Registry: TRegistry; 
begin 
    try 
    Registry := TRegistry.Create; 
    //additional code to access and use the registry object could go here 
    finally 
    Registry.Free; 
end; 

但是,當我執行下面這個結構我的代碼,我得到我的註冊表變量可能還沒有上線初始化的警告我釋放TRegistry對象。

所以,我想知道我發現的例子是否正確訪問註冊表的錯誤。我是否應該在我的TRegistry對象上調用Free,而不管Create是否成功,並忽略該警告?相反,我的try/finally塊只能在成功的構造函數調用後包圍代碼,但不能包裝create調用?還有別的嗎?

回答

22

在您的代碼中,如果TRegistry.Create引發異常,則不會分配Registry變量。因此,finally將嘗試訪問一個未初始化的變量。

編寫代碼的正確方法是確保在輸入try/finally塊之前分配變量。

Registry := TRegistry.Create; 
try 
    //additional code to access and use the registry object could go here 
finally 
    Registry.Free; 
end; 

這是Delphi編碼中最基本的生命週期管理模式,您應該深入研究肌肉記憶。

請注意,如果構造函數失敗,那麼它將在傳播異常之前清理部分構造的對象。只有構造函數成功完成時,纔會分配此代碼中的新對象引用Registry

我希望你發現的例子實際上是按照我上面的代碼寫的,你不知怎的會錯誤地轉錄它們。如果它們是按照問題編寫的,那麼它們顯然是錯誤的。

+0

我需要做的任何額外的檢查後,嘗試塊之前創建實際確保註冊表初始化好嗎? – 2012-03-17 18:46:58

+0

只是例如,http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=656&lngWId=7將是我發現的那種教程之一,這確實看起來是錯誤的,因此這個問題試圖瞭解代碼是否類似於更高級的Delphi開發人員所做的事情。 – 2012-03-17 18:48:01

+0

顯然你需要找到比該網站更好的來源! – 2012-03-17 19:00:00