delphi – 调用TObjectList.Clear时,不会释放TObjectList中的对
发布时间:2020-12-15 09:49:26 所属栏目:大数据 来源:网络整理
导读:请参阅下面的代码.为了简单起见,我删除了很多代码,但剩下的代码仍然很长,对不起:( IObserver = interface ['{1DD212F8-BD5E-47BF-9A3B-39EF7B9D99B5}'] procedure Update(Observable: IObservable); end; TObserver = class abstract (TSingletonImplementat
请参阅下面的代码.为了简单起见,我删除了很多代码,但剩下的代码仍然很长,对不起:(
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 ... 总是在你的析构函数上放置覆盖(不是虚拟的!) – 否则对Free的调用将不会执行你放入它们的代码. 所以作为基本建议: >总是编写产生零警告或提示的代码 – 它们很可能指向您迟早会遇到的缺陷>在您怀疑存在缺陷的代码中加入一个断点 – 即使忽略了编译器警告,您也会看到对Clear的调用从未进行过 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |