2017-02-02 98 views
2

比方說,我有這樣的代碼在我單位:德爾福對象引用

TClass = class(tobject) 
// ... implementation ... 
end; 

TControl = class(tobject) 
private 
    FCheck: TClass 
public 
    constructor Create(value: TClass); 
    // ... implementation... 
end; 

constructor TControl.Create(value: TClass); 
begin 
FCheck := value; 
end; 

正如你可以看到控制類要採取TClass作爲構造函數的參數,所以我需要做這樣的事情:

//The 'a' is a TClass that has already been created 

c := TControl.Create(a); 
try 
//... do what I need ... 
finally 
c.Free; 
end; 

這是很基本的:我要使用a作爲構造函數的參數,但如果我在做什麼是安全的我無法理解。我有內存泄漏嗎?

在構造函數中,我做了FCheck := value,我想這是正確的,因爲我傳遞了對象的引用。我是否必須在TControl中實施析構函數以釋放FCheck?我無法理解我是否正確管理FCheck對象。

回答

3

不,你不需要從類內部銷燬這個對象,假設它已經擁有其他地方的所有者。然而,它實際上擁有它是100%,但它應該只有一個所有者。意思是一個負責該實例生命週期的類。這一切都取決於你的具體要求。它最初可能在一個地方擁有,然後在某個時候您可以將所有權轉讓給其他人。在你的情況下,可以將它傳遞給這個構造函數,然後考慮這個所有者。如果是這種情況,那麼是的,你確實需要從課堂內部摧毀它。但是,再次,它應該只有一個業主在任何時間。

+0

我打算使用對象a,但我不會釋放它。當我釋放c時,我是否必須釋放FCheck? a是公共的並且在表單create上創建,c是在一個過程中創建的 –

+1

@RaffaeleRossi通常,對象只能由創建它的相同類獲得free'd。除非您有將所有權轉讓給其他人的可能性,否則您不應該擔心在其他地方將其釋放。這種意義上的「所有權」意味着負責任的階層。 –

+0

Aaah確定了。所以我正在做的事情很好,因爲FCheck會在我打電話給c.Free的時候死掉。正確?會接受 –