2

嘿,谁能告诉我以下示例中的析构函数的实现是否正确且相同?

  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;
4

1 回答 1

2

是的,它们都是正确的并且都相同。

通常,您会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;
于 2011-03-18T10:50:02.543 回答