加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 为什么不收集TInterfacedObject垃圾的后代?

发布时间:2020-12-15 10:12:00 所属栏目:大数据 来源:网络整理
导读:我有一个基于TInterfacedObject的类.我将它添加到TTreeNode的Data属性. TFacilityTreeItem=class(TInterfacedObject)private m_guidItem:TGUID; m_SomeOtherNode:TTreeNode;publicend; 我创建了这个对象的许多实例我认为因为他们的参考计数,我不应该释放他们
我有一个基于TInterfacedObject的类.我将它添加到TTreeNode的Data属性.
TFacilityTreeItem=class(TInterfacedObject)
private
  m_guidItem:TGUID;
  m_SomeOtherNode:TTreeNode;
public
end;

我创建了这个对象的许多实例&我认为因为他们的参考计数,我不应该释放他们.这很方便.

但是,在检查时,我打开了ReportMemoryLeaksOnShutdown,发现它们毕竟没有被释放.

这些对象是在放置在主窗体上的框架中创建的.在主窗体的FormClose中,我清除树节点,以便释放每个对象.

发生了什么?

感谢您的帮助!

解决方法

TInterfacedObject本身不是引用计数,只有接口.您可以使用TInterfacedObject实现接口,这基本上可以节省您自己实现引用计数方法的工作量.不幸的是,它仍然不适用于您的情况:编译器不知道您正在为TTreeNode.Data属性分配接口,因为它未被声明为接口而是作为指针.所以各种奇怪的事情都会发生:
MyInt := TFacilityTreeItem.Create; // ref count = 1
// Node.Data := MyInt; // won't compile
Node.Data := pointer(MyInt); // no interface assignment,ref count stays 1
...
end; // ref count reaches 0,your object gets freed

只要您尝试通过.Data属性访问对象,就会遇到访问冲突.

所以,在这种情况下不要打扰接口,你可以让它工作,但它将比它的价值更多的努力.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读