开发者

TCollectionItem and destructor method in delphi

开发者 https://www.devze.com 2023-02-18 18:19 出处:网络
Hey, Could anyone tell me if the implementations of the Destructor in the following example are correct and the same?

Hey, Could anyone tell me if the implementations of the Destructor in the following example are correct and the same?

  TTaskItem = class 开发者_JAVA技巧(TCollectionItem)
  private
    FTask: TTask;

  public
    constructor Create(Collection: TCollection);override;
    destructor Destroy;override;

    property Task: TTask read FTask write FTask;
  end;

// //Are these two the same?

destructor TTaskItem.Destroy;
begin
  inherited Destroy;
end;

destructor TTaskItem.Destroy;
begin
  inherited;
end;


Yes they are both correct and both the same.

Typically you would have created FTask in the constructor and the destructor would read:

destructor TTaskItem.Destroy;
begin
  FTask.Free;
  inherited;
end;

Always remember to include override when you declare your destructor, as you have done. If you forget this then it won't run. That's a classic source of memory/resource leaks.

You should call inherited as the first action in a constructor and as the last action of the destructor. This arranges that creation and destuction happen in reverse order which is invariably what is needed.

For example you might create two objects, A and B, and B has a reference to A which is passed in to the constructor of B. Clearly you have to create A first:

A := TClassA.Create;
B := TClassB.Create(A);

When destroying you want to destroy B first in case it does anything with the reference to A that it holds. If you did it the wrong way round, B would be calling methods on A which had already been destroyed. So your destructor reads:

B.Free;
A.Free;
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号