gpt4 book ai didi

delphi - 调用 TObjectList.Clear 时,不会释放 TObjectList 中的对象

转载 作者:行者123 更新时间:2023-12-03 15:04:39 26 4
gpt4 key购买 nike

请参阅下面的代码。为了简单起见,我删除了很多代码,但是剩下的代码仍然很长,抱歉:(

  IObserver = interface
['{1DD212F8-BD5E-47BF-9A3B-39EF7B9D99B5}']
procedure Update(Observable: IObservable);
end;

TObserver = class abstract (TSingletonImplementation, IObserver)
strict protected
//...
public
constructor Create;
destructor Destroy; virtual;
//IObserver
procedure Update(Observable: IObservable); virtual; abstract;
//...
end;

TShapeModification = class abstract (TObserver)
strict protected
//...
public
//Doesn't have a constructor
end;

TRangePointModification = class(TShapeModification)
strict private
//...
public
constructor Create(...);
//...
end;

constructor TRangePointModification.Create(...);
begin
inherited Create;
//...
end;

然后在某个时刻:

TClientClass = class
strict private
fList: TObjectList<TShapeModification>;
public
constructor Create();
destructor Destroy(); override;
procedure Add(ShapeModification: TShapeModification);
end;

constructor TClientClass.Create;
begin
Self.fList:=TObjectList<TShapeModification>.Create(true);
end;

destructor TClientClass.Destroy;
begin
Self.fList.Clear;
FreeAndNil(Self.fList);
end;

最后,在某个时刻:

var
MyClient: TClientClass;
begin
MyClient:=TClientClass.Create();
MyClient.Add(TRangePointModification.Create());
MyClient.Free;
end;

MyClient被释放后,TClientClass然后调用内部的析构函数 fList应该被清除,但 TRangePointModification 的析构函数(来自 TObserver )未被调用。 为什么不呢?

(我使用的是 Delphi 10.2 Tokyo)

最佳答案

查看警告 - 编译器会告诉您出了什么问题:

W1010 Method 'Destroy' hides virtual method of base type ...

始终将override放在析构函数上(不是虚拟的!) - 否则对Free的调用将不会执行您放入其中的代码。

作为基本建议:

  1. 始终编写产生零警告或提示的代码 - 它们很可能指出您迟早会遇到的缺陷

  2. 在您怀疑有缺陷的代码中放置一个断点 - 即使忽略编译器警告,您也会发现从未进行过对 Clear 的调用

关于delphi - 调用 TObjectList.Clear 时,不会释放 TObjectList 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51476069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com