嘿,谁能告诉我下面例子中的析构函数的实现是否正确和相同?
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;发布于 2011-03-18 18:50:03
是的,它们都是正确的,而且都是一样的。
通常,您将在构造函数中创建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;https://stackoverflow.com/questions/5350821
复制相似问题