Delphi TInterfacedObject自动内存管理是否也适用于C++;建设者

Delphi TInterfacedObject自动内存管理是否也适用于C++;建设者,delphi,memory-management,c++builder,portability,Delphi,Memory Management,C++builder,Portability,博客文章“”说 用Delphi编写的几乎任何东西都可以在C++Builder中轻松使用 (…)您可以为Delphi项目编写一次对象,然后 在C++项目中重用它,未改变, 那么TInterfacedObject及其基于引用计数的自动内存管理呢?这是否也应该与C++Builder配合使用,而不会造成内存泄漏?或者基于C++的内存管理与基于引用的基于接口的技术不兼容? delphi/C++(我强调): TInterfacedObject提供了基本的引用计数功能 使其派生类在Delphi和C++代码>

博客文章“”说

用Delphi编写的几乎任何东西都可以在C++Builder中轻松使用 (…)您可以为Delphi项目编写一次对象,然后 在C++项目中重用它,未改变,

那么TInterfacedObject及其基于引用计数的自动内存管理呢?这是否也应该与C++Builder配合使用,而不会造成内存泄漏?或者基于C++的内存管理与基于引用的基于接口的技术不兼容?

delphi/C++(我强调):

TInterfacedObject提供了基本的引用计数功能 使其派生类<强>在Delphi和C++代码>/P>中都很有用。
请注意:这个问题是关于在C++ Builder项目中直接编译Delphi/Object PASCAL源代码(在做C++ Cuilder预编译器运行之后),而不是通过动态链接(DLL)

< P> C++编译器不会发出代码来调用<代码> AddiFF < /C>和<代码>发布< /C>。在C++中没有特殊的<代码>接口< /代码>类型。相反,您需要确保对
AddRef
Release
进行必要的调用。这通常是通过在智能指针中包装原始接口来实现的。在C++-Builder中,您可以选择使用或
TComInterface

Serg在本文中涉及到这个主题:。这篇文章的摘要值得重复:

值得一提的一些细节:

  • Delphi接口总是源于IUnknown;一个相应的纯抽象C++类也应该定义IONDENT方法;李>
  • Delphi接口类型是指向相应C++抽象类的指针,因此有时需要一个更高级别的间接 C++代码;<李>
  • Delphi接口变量总是由编译器初始化为nil;在C++中,我们需要默认构造函数来实现 零初始化
  • 当接口变量退出时,Delphi接口会自动释放(即调用IUnknown.\u Release method) 范围在C++中,我们在析构函数中实现相同的功能;<李>
  • Delphi中的接口赋值隐式调用IUnknown的_Addref和_Release方法;在C++中,我们重载赋值运算符以正确地执行接口分配;<李>

< > C++编译器没有直接用Delphi的方式实现<代码>接口> <代码> >的引用计数。然而,
系统中有一个方便的模板
,用于包装接口和提供引用计数,
,这是为了编写类似于Delphi的代码

当使用接口编译.pas文件时,使用.Hp文件的类型是自动生成的,并且在C++代码中也可以很容易地创建。事实上,您以前可能见过它们-使用此模板自动生成的类型名称都以
\u di\u
开头,例如Delphi接口
IMyInterface
的转换为
\u di\u 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;
//公开Add(..)方法的接口
__接口接口(UUID)({D0C74612-9E4D-459A-9304-FACE27E3577D}”)IAdder:public System::IInterface
{
虚拟整数uu快速调用加法(整数I,整数J)=0;
};
typedef系统::DelphiInterface(数据接口);

在C++代码中使用<代码>第二加法器< /C> >代替代码> iAuth<代码>,您将发现引用引用被计数。


有用阅读是C++(Builder)中新的(如XE)标准COM系统,它取代了ATL。可以在CB的早期版本中使用它(例如,我在2010年使用过),但它不受支持。我想我鼓励它通过我当时与Embarcadero内部员工的一些对话得到官方支持。(我不知道我是否真的有影响力——我只是想这样做):< /P>这篇文章是专门调用C++的Delphi DLL的。我的问题是关于在C++ Builder项目中直接编译Delphi/Object Pascal代码(它需要一些预处理器运行,但不涉及动态链接),而不管Delphi代码是否在DLL中,或者链接到C++编译器,都不会发出引用计数。接口包装器(如智能指针)是生成

AddRef
Release
调用的常用方法。我是否正确理解,要使用引用计数,原始的Delphi代码保持不变-只有C++Builder端需要应用模板和使用di类型?您是否遇到过值得注意的案例(Delphi构造),其中C++Builder仍然使用此解决方案泄漏内存?@mjn,没错。在C++ Builder中使用Delphi接口时,将其封装在 Delphi接口> /Cuff>模板中,并且始终(仅)通过包装的<代码>如果您遵循这些规则,引用计数将起作用。我没有遇到任何内存泄漏使用该模板。