首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TDictionary中的内存泄漏-解决方法的问题?

TDictionary中的内存泄漏-解决方法的问题?
EN

Stack Overflow用户
提问于 2009-02-04 13:15:51
回答 3查看 2.6K关注 0票数 3

我刚刚考虑使用新的TDictionary类型。但我在QualityCentral上读到了两个由TDictionary引起的内存泄漏:

http://qc.codegear.com/wc/qcmain.aspx?d=67355

我只是实现了建议的解决方法,基本上是对TDictionary进行子类化,覆盖析构函数,并手动释放导致泄漏的两个对象:

代码语言:javascript
复制
destructor TMemCorrectedDictionary.Destroy;
begin
  Values.Free;
  Keys.Free;
  inherited;
end;

问题是,由于Values和Keys是TDictionary的只读属性,所以我不能将它们设置为空。好吧,为了清楚起见,现在一切都很好,但我想知道如果CodeGear发布了泄漏的补丁并在各自的析构函数中再次释放这两个对象,会发生什么。这不会导致访问冲突吗?

提前感谢您的阅读(希望您能回答)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-04 13:23:21

您可以先调用inherited并检查属性是否仍在设置中:

代码语言:javascript
复制
destructor TMemCorrectedDictionary.Destroy;
begin
  inherited;
  Values.Free;
  Keys.Free;
end;

顺便说一句:Free并不关心要释放的实例是否为nil,所以当(但仅当) inherited Destroy将属性设置为nil时,这才会起作用。

票数 2
EN

Stack Overflow用户

发布于 2014-02-27 16:48:10

我不知道以前版本的Delphi怎么样,但是在XE5中有一个TObjectDictionary类,它负责释放所有的子项。

票数 2
EN

Stack Overflow用户

发布于 2019-08-22 11:23:29

在创建字典时使用此参数,它将释放对象。

代码语言:javascript
复制
TObjectDictionary<string, TMyClass>.Create([doOwnsValues]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/511289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档