c++ - 从 D 调用 C++

标签 c++ d

我已经阅读了解释如何从 D 调用 C++ 的文档:http://dlang.org/cpp_interface.html .然而,有几件事对我来说不是很清楚。

以D网站提供的例子为例:

#include <iostream>

using namespace std;

class D {
   public:
   virtual int bar(int i, int j, int k)
   {
       cout << "i = " << i << endl;
       cout << "j = " << j << endl;
       cout << "k = " << k << endl;
       return 8;
   }
};

D *getD() {
   D *d = new D();
   return d;
}

然后可以从 D 调用 C++ 类,如下所示:

extern (C++) {
    interface D {
        int bar(int i, int j, int k);
    }

    D getD();
}

void main() {
   D d = getD();
   d.bar(9,10,11);
}

我不太清楚 C++ 对象是如何被删除的。 D 垃圾收集器是否在 C++ 对象上调用 delete,或者我们是否需要提供一个“删除”函数来删除对象并从 D 中手动调用它?在我看来,如果我向 C++ 类添加一个析构函数,它就永远不会被调用。我还注意到,C++ 类必须以与在 D 接口(interface)中声明的顺序完全相同的顺序声明成员函数(例如,如果我在 bar() 方法之前添加析构函数,则无法从 D 调用 C++ 对象,但是如果在 bar() 方法之后声明了析构函数,则一切正常)。

如果D接口(interface)定义为:

extern(C++){
   interface D{
       int bar();
       int foo();
   }
}

对应的C++类由下式给出:

class D{
public:
   virtual int bar(){};
   virtual int foo(){};

};

如何保证 C++ 虚方法 vtbl 将按照与 D 接口(interface)中声明的方法相同的顺序创建。对我来说,对此没有任何保证。换句话说,我们如何确定 D::bar() 将位于 vtbl 中的第一个位置?这不依赖于实现/编译器吗?

最佳答案

我不希望 D 的垃圾收集器知道如何释放 C++ 对象。这意味着(至少)D 运行时:

  1. 对 C++ 运行时做出假设,即如何删除 C++ 对象
  2. 其他 C++ 代码不再需要该对象

我确定您必须提供另一个 C++ 函数来调用传递给它的对象。事实上,许多 C++ 库(即使也从 C++ 中使用)在从库内部调用构造函数的情况下具有相同的模式。即使在直接 C 中,在一个 dll/exe 中分配内存并在另一个中释放它通常也是一个坏主意。如果两个二进制文件不共享同一个运行时库,这可能会严重破坏。

关于c++ - 从 D 调用 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20893471/

相关文章:

c++ - 如何 "invalidate"一个像STL迭代器的对象

c++ - gcc 4.8 或更早版本是否存在关于正则表达式的问题?

ms-word - 如何在将其用作 zip 存档后制作正确的 docx?

d - 为什么 readf 没有按预期运行?

regex - std.regex.regex 的返回值?

attributes - UDA opCall __traits

c++ - glPush/PopMatrix() 和 glRotatef() 似乎是单独移动对象,而不是 glPush/PopMatrix() 中包含的所有对象

c++ - 捕获异常后崩溃

c++ - 以最佳方式返回负数的计数

stack - 在 D 中对齐堆栈变量