gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:15:24 25 4
gpt4 key购买 nike

我有一个基于 TInterfacedObject 的类。我将其添加到 TTreeNode 的 Data 属性中。

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

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

但是,在检查此内容时,我打开了 ReportMemoryLeaksOnShutdown 并发现它们毕竟没有被释放。

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

发生了什么事?

感谢您的帮助!

最佳答案

TInterfacedObject 本身不进行引用计数,只有接口(interface)才进行引用计数。您可以使用 TInterfacedObject 实现接口(interface),这基本上节省了您自己实现引用计数方法的精力。不幸的是,它在您的情况下仍然不起作用:编译器不知道您正在为 TTreeNode.Data 属性分配接口(interface),因为它没有声明为接口(interface)而是指针。于是就会发生各种奇怪的事情:

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 属性访问对象,您就会遇到访问冲突。

所以,在这种情况下,不要理会接口(interface),你可以让它工作,但它会比它值得的付出更多的努力。

关于delphi - 为什么 TInterfacedObject 的后代不被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/484937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com