【问题标题】:TCollectionItem and destructor method in delphidelphi中的TCollectionItem和析构函数方法
【发布时间】:2011-03-18 10:42:39
【问题描述】:
嘿,
谁能告诉我以下示例中的析构函数的实现是否
是否正确且相同?
TTaskItem = class (TCollectionItem)
private
FTask: TTask;
public
constructor Create(Collection: TCollection);override;
destructor Destroy;override;
property Task: TTask read FTask write FTask;
end;
//
//这两个是一样的吗?
destructor TTaskItem.Destroy;
begin
inherited Destroy;
end;
destructor TTaskItem.Destroy;
begin
inherited;
end;
【问题讨论】:
标签:
delphi
destructor
inherited
tcollectionitem
【解决方案1】:
是的,它们都正确且相同。
通常您会在构造函数中创建FTask,而析构函数将显示为:
destructor TTaskItem.Destroy;
begin
FTask.Free;
inherited;
end;
当你声明你的析构函数时,一定要记得包含override,就像你所做的那样。如果您忘记了这一点,它将不会运行。这是内存/资源泄漏的典型来源。
您应该调用inherited 作为构造函数中的第一个操作和析构函数的最后一个操作。这安排了创建和销毁以相反的顺序发生,这总是需要的。
例如,您可能会创建两个对象,A 和 B,并且 B 具有对 A 的引用,该引用被传递给 B 的构造函数。显然您必须先创建 A:
A := TClassA.Create;
B := TClassB.Create(A);
销毁时你想先销毁 B,以防它对它持有的 A 的引用做任何事情。如果您以错误的方式执行此操作,则 B 将调用已被销毁的 A 上的方法。所以你的析构函数是:
B.Free;
A.Free;