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;
Другие вопросы по тегам