2017-02-02 150 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的时候死掉。正确?会接受 –