当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么不收集TInterfacedObject垃圾的后代?》经验,为你挑选了1个好方法。

我有一个基于TInterfacedObject的类.我将它添加到TTreeNode的Data属性.

TFacilityTreeItem=class(TInterfacedObject)
private
  m_guidItem:TGUID;
  m_SomeOtherNode:TTreeNode;
public
end;

我创建了这个对象的许多实例,并假设因为它们被引用计数,我不需要释放它们.那会很方便.

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

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

发生了什么?

谢谢您的帮助!



1> dummzeuch..:

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属性访问您的对象,您将获得访问冲突.

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

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有