问题标签 [tinterfacedobject]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - 为什么不收集 TInterfacedObject 的后代垃圾?
我有一个基于 TInterfacedObject 的类。我将它添加到 TTreeNode 的 Data 属性中。
我创建了这个对象的许多实例并假设因为它们是引用计数的,所以我不需要释放它们。那会很方便。
但是,当检查这个时,我打开了 ReportMemoryLeaksOnShutdown 并发现它们毕竟没有被释放。
这些对象是在放置在主窗体上的框架中创建的。在主窗体的 FormClose 中,我清除树节点,以便释放每个对象。
发生了什么?
感谢您的帮助!
delphi - 对象的引用计数
在我的代码中,我使用了一个在不同位置创建的小型数据存储类。为了避免内存泄漏和简化事情,我想使用引用计数,所以我做了
并删除了我对 TFileInfo.Free 的所有手动调用。不幸的是,Delphi 报告了很多内存泄漏。搜索 SO 我发现以下问题解释了为什么这不起作用:
为什么不收集 TInterfacedObject 的后代垃圾?
那里提供了一种解决方法,但它需要我(至少如果我做对了)编写自定义接口 IFileInfo 并为其提供很多我想避免的 getter 和 setter。
编辑我应该补充一点,我将创建的 FileInfo 对象插入到两种不同类型的哈希表中:一种从 TBucketList 下降,另一种是来自 Codegear 论坛的哈希映射实现。在内部,它们都是用户指针,所以情况就像另一个问题一样。
是否有任何其他可能使 Delphi 中的对象使用引用计数?
arrays - 当它们看起来相同时,为什么编译器会说实现“与先前的声明不同”?
我有两个单元,第一个,我的界面:
第二单元,我的对象声明:
我仅在“proceso”功能和“iniciar”程序中收到错误消息:
'Iniciar' 的声明不同于之前
的'Proceso' 的声明与之前的声明不同。
我注意到他们有数组参数。参数的类型在第一个单元中定义,如果我在第二个单元中定义这些类型,我会得到相同的错误,但它显示在对象的声明中。我该如何编译?
delphi - 如何实现两个具有相同名称的方法的接口?
我正在尝试声明要从中继承的接口的自定义列表,以获取特定接口的列表(我知道 IInterfaceList,这只是一个示例)。我使用的是 Delphi 2007,所以我无法访问实际的泛型(可怜我)。
这是一个简化的示例:
TSpecificInterfaceList 不会编译:
E2211 “GetFirst”声明与接口“ISpecificInterfaceList”中的声明不同
我想我理论上可以使用 TCustomInterfaceList 但我不想每次使用它时都必须投射“GetFirst”。我的目标是拥有一个既继承基类的行为又包装“GetFirst”的特定类。
我怎样才能做到这一点?
谢谢!
delphi - 从 TInterfacedObject 派生的 XE8 64 位调试对象
假设我有一个类 TCar,它支持接口 ICar,并且是从 TInterfacedObject 派生的。
当我在 32 位模式下调试上面的代码时,我可以进入 TCar 类的方法“Start”,此外,当我将鼠标悬停在汽车变量上时,我看到它是“TCar(address) as ICar”但是当我尝试在 64 位模式下调试此代码我无法进入方法“Start”(调试执行只是传递到方法调用下方的下一行而无需介入)并且当我移动时我看到“Pointer(address) as ICar”鼠标悬停在汽车变量上。我究竟做错了什么?能够介入方法在我的项目中非常重要。
最近在干净的机器上安装了 Delphi XE8,并且没有安装防病毒软件。
delphi - 为什么类(TInterfacedObject,IDropTarget)的实例不能自动释放?
我正在实现我IDropTarget
的基础:如何允许表单在不处理 Windows 消息的情况下接受文件删除?
David的实现效果很好。但是IDropTarget
( TInterfacedObject
) 对象不会自动释放,即使设置为“nil”也不会。
部分代码是:
哪里FDropTarget: IDropTarget;
。
当我单击该按钮时,不显示任何 MessageBox,并且该对象没有被破坏。
如果我在构造函数末尾_Release;
按照此处的建议FDropTarget
调用,则在单击按钮或程序终止时被破坏(我对此“解决方案”有疑问)。
如果我省略RegisterDragDrop(FHandle, Self)
,FDropTarget
则按预期销毁。
我认为引用计数由于某种原因被破坏了。我真的很困惑。我怎样才能TInterfacedObject
正确地免费?
编辑:
这是完整的代码:
DFM:
结论: 来自文档:
RegisterDragDrop
函数还调用 IDropTarget 指针上的 IUnknown::AddRef 方法
我链接的答案中的代码是固定的。
请注意,TDropTarget 上的引用计数被抑制。这是因为当 RegisterDragDrop 被调用时,它会增加引用计数。这会创建一个循环引用,并且此代码会抑制引用计数会破坏它。这意味着您将通过类变量而不是接口变量来使用此类,以避免泄漏。
delphi - 在依赖对象中使用 TInterfacedObject 作为接口引用时的内存泄漏
介绍
我发现我的代码泄漏了TInterfacedObject
我作为接口引用保存的一个实例的内存。尽管我将引用变量重置为nil
使用后,但它仍然存在。
泄漏的对象是类TMasterObject
,它实现了两个接口IInterfaceX
和IInterfaceY
. 对象的引用保存在一个类型为 的变量中IInterfaceY
。
TMasterObject
的实施IInterfaceX
纯属巧合。因为它有两个实例TSomeObject
,需要引用这个接口,所以我也实现了它TMasterObject
。
MCVE/SSCCE
问题
可以使用哪些策略
- 解决这个特定的问题和
- 以后避免此类问题?
delphi - 在 Delphi 中 class(TInterfacedObject) 是否需要析构函数?
Destroy()
我在这种从未被调用的情况下运行。
阅读这篇文章,只有一个构造函数,没有实现析构函数。
这有什么特别的原因吗?
我是否应该释放(如果需要)将myClass
通过实现一个finalization
部分来定义的所有其他对象?