TCollectionItem и метод деструктора в Delphi - PullRequest
2 голосов
/ 18 марта 2011

Эй, кто-нибудь может сказать мне, если реализации Деструктора в следующем примере верны и одинаковы?

  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 Ответ

2 голосов
/ 18 марта 2011

Да, они оба верны и оба одинаковы.

Обычно вы бы создали 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;
...