gpt4 book ai didi

delphi - TInterfacedObject 自动内存管理也可以与 C++Builder 一起使用吗?

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

博客文章“Application Development with C++Builder and Delphi”说的是

Almost anything you write in Delphi can easily be used in C++Builder (...) You can write an object once for a Delphi project, and then reuse it, unchanged, in a C++ project.

TInterfacedObject 及其基于引用计数的自动内存管理怎么样,这是否也可以与 C++Builder 一起使用,而不会造成内存泄漏?或者基于 C++ 的内存管理与这种基于引用计数接口(interface)的技术不兼容?

Delphi/C++ documentation for TInterfacedObject说(由我突出显示):

TInterfacedObject provides basic reference-counting functionality that makes its descendent classes useful in both Delphi and C++ code.

请注意:这个问题是关于在 C++Builder 项目中直接编译 Delphi/Object Pascal 源代码(据我所知,在执行 C++Builder 预编译器运行后),而不是通过动态链接 (DLL)

最佳答案

C++ 编译器不直接对 __interface 实现引用计数德尔福就是这样做的。然而,System中有一个方便的模板。用于包装接口(interface)并提供引用计数, System::DelphiInterface ,这是the standard C++ Builder way编写行为类似于 Delphi 的代码。

使用接口(interface)编译 .pas 文件时,使用此类型的类型会在 .hpp 文件中自动生成,也可以在 C++ 代码中轻松创建。事实上,您以前可能已经见过它们 - 使用此模板自动生成的类型名称均以 _di_ 开头。 ,例如Delphi接口(interface)的转换IMyInterface_di_IMyInterface .

直接从帮助文件链接复制是这样的示例:

// Interface that exposes an Add(..) method
__interface INTERFACE_UUID("{D0C74612-9E4D-459A-9304-FACE27E3577D}") IAdder : public System::IInterface
{
virtual int __fastcall Add(int I, int J) = 0 ;
};
typedef System::DelphiInterface<IAdder> _di_IAdder;

使用_di_Adder在 C++ 代码中的任何地方,而不是 IAdder ,您会发现您的引用文献已被计数。

有用的读物​​是 entire section on DAX ,C++ Builder 中新的(从 XE 开始)标准 COM 系统,它取代了 ATL。可以在 CB 的早期版本中使用它(例如,我在 2010 年就使用过),但它不受支持。我想我是通过当时与一些内河码头内部员工的一些对话鼓励它获得官方支持的。 (我不知道我是否真的有任何影响力 - 我只是喜欢这样认为:)

关于delphi - TInterfacedObject 自动内存管理也可以与 C++Builder 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28813133/

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