7

给定以下 Delphi 代码,FooFree'd on FormClose,但TFoo.Destroy没有被调用 - 因此Bar不是Free'd,导致内存泄漏?

我在这里错过了什么还是不应该 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;

如果没有覆盖,则永远不会调用您的析构函数,而是调用基类。

于 2012-05-25T14:20:31.430 回答