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的调用从未进行过
总结以上是内存溢出为你收集整理的delphi – 调用TObjectList.Clear时,不会释放TObjectList中的对象全部内容,希望文章能够帮你解决delphi – 调用TObjectList.Clear时,不会释放TObjectList中的对象所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)