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