问题标签 [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.

0 投票
3 回答
2587 浏览

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

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

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

但是,当检查这个时,我打开了 ReportMemoryLeaksOnShutdown 并发现它们毕竟没有被释放。

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

发生了什么?

感谢您的帮助!

0 投票
7 回答
6346 浏览

delphi - 对象的引用计数

在我的代码中,我使用了一个在不同位置创建的小型数据存储类。为了避免内存泄漏和简化事情,我想使用引用计数,所以我做了

并删除了我对 TFileInfo.Free 的所有手动调用。不幸的是,Delphi 报告了很多内存泄漏。搜索 SO 我发现以下问题解释了为什么这不起作用:

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

那里提供了一种解决方法,但它需要我(至少如果我做对了)编写自定义接口 IFileInfo 并为其提供很多我想避免的 getter 和 setter。

编辑我应该补充一点,我将创建的 FileInfo 对象插入到两种不同类型的哈希表中:一种从 TBucketList 下降,另一种是来自 Codegear 论坛的哈希映射实现。在内部,它们都是用户指针,所以情况就像另一个问题一样。

是否有任何其他可能使 Delphi 中的对象使用引用计数?

0 投票
3 回答
714 浏览

arrays - 当它们看起来相同时,为什么编译器会说实现“与先前的声明不同”?

我有两个单元,第一个,我的界面:

第二单元,我的对象声明:

我仅在“proceso”功能和“iniciar”程序中收到错误消息:

'Iniciar' 的声明不同于之前
的'Proceso' 的声明与之前的声明不同。

我注意到他们有数组参数。参数的类型在第一个单元中定义,如果我在第二个单元中定义这些类型,我会得到相同的错误,但它显示在对象的声明中。我该如何编译?

0 投票
3 回答
1088 浏览

delphi - 如何实现两个具有相同名称的方法的接口?

我正在尝试声明要从中继承的接口的自定义列表,以获取特定接口的列表(我知道 IInterfaceList,这只是一个示例)。我使用的是 Delphi 2007,所以我无法访问实际的泛型(可怜我)。

这是一个简化的示例:

TSpecificInterfaceList 不会编译:

E2211 “GetFirst”声明与接口“ISpecificInterfaceList”中的声明不同

我想我理论上可以使用 TCustomInterfaceList 但我不想每次使用它时都必须投射“GetFirst”。我的目标是拥有一个既继承基类的行为又包装“GetFirst”的特定类。

我怎样才能做到这一点?

谢谢!

0 投票
0 回答
96 浏览

delphi - 从 TInterfacedObject 派生的 XE8 64 位调试对象

假设我有一个类 TCar,它支持接口 ICar,并且是从 TInterfacedObject 派生的。

当我在 32 位模式下调试上面的代码时,我可以进入 TCar 类的方法“Start”,此外,当我将鼠标悬停在汽车变量上时,我看到它是“TCar(address) as ICar”但是当我尝试在 64 位模式下调试此代码我无法进入方法“Start”(调试执行只是传递到方法调用下方的下一行而无需介入)并且当我移动时我看到“Pointer(address) as ICar”鼠标悬停在汽车变量上。我究竟做错了什么?能够介入方法在我的项目中非常重要。

最近在干净的机器上安装了 Delphi XE8,并且没有安装防病毒软件。

0 投票
1 回答
759 浏览

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 被调用时,它会增加引用计数。这会创建一个循环引用,并且此代码会抑制引用计数会破坏它。这意味着您将通过类变量而不是接口变量来使用此类,以避免泄漏。

0 投票
0 回答
149 浏览

delphi - 在依赖对象中使用 TInterfacedObject 作为接口引用时的内存泄漏

介绍

我发现我的代码泄漏了TInterfacedObject我作为接口引用保存的一个实例的内存。尽管我将引用变量重置为nil使用后,但它仍然存在。

泄漏的对象是类TMasterObject,它实现了两个接口IInterfaceXIInterfaceY. 对象的引用保存在一个类型为 的变量中IInterfaceY

TMasterObject的实施IInterfaceX纯属巧合。因为它有两个实例TSomeObject,需要引用这个接口,所以我也实现了它TMasterObject

MCVE/SSCCE

问题

可以使用哪些策略

  1. 解决这个特定的问题和
  2. 以后避免此类问题?
0 投票
2 回答
801 浏览

delphi - 在 Delphi 中 class(TInterfacedObject) 是否需要析构函数?

Destroy()我在这种从未被调用的情况下运行。

阅读这篇文章,只有一个构造函数,没有实现析构函数。

这有什么特别的原因吗?

我是否应该释放(如果需要)将myClass通过实现一个finalization部分来定义的所有其他对象?