TCollectionItem и метод деструктора в Delphi
Эй, может кто-нибудь сказать мне, если реализации Деструктора в следующем примере являются правильными и одинаковыми?
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;
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;