首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TInterfacedObject自动内存管理也与C++Builder一起工作吗?

TInterfacedObject自动内存管理也与C++Builder一起工作吗?
EN

Stack Overflow用户
提问于 2015-03-02 15:13:17
回答 2查看 588关注 0票数 3

博客文章"用C++Builder和Delphi开发应用程序“说

您用Delphi编写的几乎任何东西都可以很容易地在C++Builder (.)中使用。您可以为Delphi编写一次对象,然后在C++项目中重复使用它。

那么TInterfacedObject及其基于参考计数的自动内存管理呢?这是否也适用于C++Builder,而不产生内存泄漏呢?还是基于C++的内存管理与这种基于ref计数的接口技术不兼容?

德尔菲/ C++ TInterfacedObject文档说(由我强调):

TInterfacedObject提供了基本的引用计数功能,使其后代类在Delphi和C++代码中都很有用。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-02 22:05:38

C++编译器并不像__interface那样直接实现引用计数。但是,System 中有一个方便的模板,用于包装接口并提供引用计数, 系统::DelphiInterface,这是标准的C++生成器方法,用于编写类似于Delphi的代码。

使用它的类型是在使用接口编译.hpp文件时在.pas文件中自动生成的,并且可以很容易地在C++代码中创建。事实上,您可能以前见过它们--使用此模板自动生成的类型名称都是以_di_开头的,例如Delphi接口IMyInterface的转换是_di_IMyInterface

直接从帮助文件链接复制是以下示例:

代码语言:javascript
复制
// 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,您将发现引用被计算在内。

有用的阅读是关于DAX的整个章节,它是C++ Builder中新的( XE)标准COM系统,它取代了C++。可以在CB的早期版本中使用它(例如,我在2010年就这样做了),但它没有得到支持。我喜欢我鼓励它成为官方支持,通过一些交谈,我当时与一些内部Embarcadero的工作人员。(我不知道我是否真的有任何影响力,我只是想这样想:)

票数 2
EN

Stack Overflow用户

发布于 2015-03-02 15:23:46

C++编译器不会发出调用AddRefRelease的代码。在interface中没有特殊的C++类型。相反,您需要确保对AddRefRelease进行了必要的调用。这通常是通过在智能指针中封装原始接口来实现的。在C++-Builder中,您可以选择使用DelphiInterfaceTComInterface<T>

Serg在本文中谈到了这个主题:在Dephi和C++中使用Delphi接口。该条的摘要值得重复:

值得提及的一些细节:

  • Delphi接口总是从IUnknown派生出来的,相应的纯抽象C++类也应该定义IUnknown方法;
  • Delphi接口类型是指向相应的C++抽象类的指针,因此有时需要在C++代码中增加一个间接的层次;
  • Delphi接口变量总是由编译器初始化为零,在C++中需要默认的构造函数来实现零初始化;
  • 当接口变量超出作用域时,Delphi接口被自动释放(即调用IUnknown._Release方法),在C++中,我们在析构函数中实现了相同的功能;
  • Delphi中的接口赋值隐式调用_Addref和_Release方法的IUnknown,在C++中重载赋值操作符以正确实现接口分配;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28813133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档