2

ねえ、次の例のデストラクタの実装が正しくて同じかどうか誰か教えてくれませんか?

  TTaskItem = class (TCollectionItem)
  private
    FTask: TTask;

  public
    constructor Create(Collection: TCollection);override;
    destructor Destroy;override;

    property Task: TTask read FTask write FTask;
  end;

// //これら 2 つは同じものですか?

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 の 2 つのオブジェクトを作成するとします。B には、B のコンストラクターに渡される A への参照があります。明らかに、最初に A を作成する必要があります。

A := TClassA.Create;
B := TClassB.Create(A);

破棄するときは、保持している A への参照を使用して何かを行う場合に備えて、最初に B を破棄します。間違った方法で行った場合、B は既に破棄された A のメソッドを呼び出すことになります。したがって、デストラクタは次のように読み取ります。

B.Free;
A.Free;
于 2011-03-18T10:50:02.543 に答える