我刚刚考虑使用新的TDictionary类型。但我在QualityCentral上读到了两个由TDictionary引起的内存泄漏:
http://qc.codegear.com/wc/qcmain.aspx?d=67355
我只是实现了建议的解决方法,基本上是对TDictionary进行子类化,覆盖析构函数,并手动释放导致泄漏的两个对象:
destructor TMemCorrectedDictionary.Destroy;
begin
Values.Free;
Keys.Free;
inherited;
end;问题是,由于Values和Keys是TDictionary的只读属性,所以我不能将它们设置为空。好吧,为了清楚起见,现在一切都很好,但我想知道如果CodeGear发布了泄漏的补丁并在各自的析构函数中再次释放这两个对象,会发生什么。这不会导致访问冲突吗?
提前感谢您的阅读(希望您能回答)。
发布于 2009-02-04 13:23:21
您可以先调用inherited并检查属性是否仍在设置中:
destructor TMemCorrectedDictionary.Destroy;
begin
inherited;
Values.Free;
Keys.Free;
end;顺便说一句:Free并不关心要释放的实例是否为nil,所以当(但仅当) inherited Destroy将属性设置为nil时,这才会起作用。
发布于 2014-02-27 16:48:10
我不知道以前版本的Delphi怎么样,但是在XE5中有一个TObjectDictionary类,它负责释放所有的子项。
发布于 2019-08-22 11:23:29
在创建字典时使用此参数,它将释放对象。
TObjectDictionary<string, TMyClass>.Create([doOwnsValues]);https://stackoverflow.com/questions/511289
复制相似问题