Учитывая следующий Delphi код, Foo
является Free
«D на FormClose
, но TFoo.Destroy
не вызывается - и поэтому Bar
не Free
» d, что приводит к утечке памяти?Почему Destroy не называется?
Пропустил ли я что-то здесь или не должен Foo.Free.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;
деструктор Destroy(); *** override; *** К сожалению. –
Разве компилятор не предупредил вас о вашем коде? Это должно быть. Что-то о скрытии виртуального метода с тем же именем. –
Никогда не игнорируйте предупреждение. Игнорировать предупреждение игнорирует ошибку, во многих случаях! –