7

次のDelphiコードを考えると、Foo' Freed onFormCloseですが、TFoo.Destroy呼び出されていません-したがって、' dではBarなくFree、メモリリークが発生しますか?

私はここで何かを逃したことがありますか、それともFoo.Freeに電話してFoo.Destroyするべきではありませんか?

type
  TBar = class
  SomeInteger : integer;
end;

TFoo = class
  Bar : TBar;

  constructor Create();
  destructor Destroy();
end;

var
  Foo : TFoo;

implementation

constructor TFoo.Create;
begin
  Bar := TBar.Create;
  Bar.SomeInteger := 2;
end;

destructor TFoo.Destroy;
begin
  Bar.Free;
  Bar := nil;

  showmessage('Destroyed!');
end;

procedure TForm10.FormCreate(Sender: TObject);
begin
  Foo := TFoo.Create;

  showmessage('Foo created');
end;

procedure TForm10.FormDestroy(Sender: TObject);
begin
  Foo.Free;
  Foo := nil;
end;
4

2 に答える 2

26

デストラクタの署名をオーバーライドでマークする必要があります。

destructor Destroy(); override;

inheritedそして、デストラクタの最後にあるはずです。しかし、あなたのクラスはTObject以外のものから派生していないので、それは問題ではないと思います。

于 2012-05-25T14:18:32.693 に答える
11

Destroyは仮想であるため、子孫クラスでそれをオーバーライドする必要があります。

TFoo = class
  Bar : TBar;

  constructor Create();
  destructor Destroy(); override; // must add override here
end;

オーバーライドがないと、デストラクタが呼び出されることはなく、代わりに基本クラス1が呼び出されます。

于 2012-05-25T14:20:31.430 に答える