【问题标题】: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;
    

    【讨论】:

    • 好的,只是想确定一下。谢谢!
    猜你喜欢
    • 2012-04-02
    • 2017-02-06
    • 2011-01-16
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多