在 D 中实现 class 并在 C++ 中实例化/lifetimetrack

implement class in D and instanciate / lifetimetrack in C++

我尝试在 D 中实现一个 class 并将其导出到 C++。与 this 教程中的示例不同,我想在 C++ 中控制生命周期。 我认为可以在 D 中调用一个工厂方法,创建一个实例,将其标记为 gcRoot 并 return 它。当 C++ 不再需要此 class 时,它会调用 D 中的函数以取消将实例标记为 GCRoot。 以下代码编译但在从 c++

调用计数函数时产生 sigsegv

D 代码:

import core.memory;

extern (C++) interface B {
public:
    extern (C++) int count();

private:
}

class D : B {
    extern (C++)int count() { return 10; }
};

extern (C++) B*   CreateB() {
    B inst = new D();
    B* instPtr = &inst;
    core.memory.GC.addRoot(instPtr);

    return instPtr;
}

C++代码:

class B {
public:
   virtual int count();
};

B* CreateB();

extern "C" int rt_init();

int main(int argc, char *argv[])
{
    rt_init();

    B* b = CreateB();
    int i = b->count();
    return 0;
}

你的问题是在 D 中 class 已经是引用类型(指针)所以你不能再次取消引用它:

import core.memory;

extern (C++) interface B {
public:
    extern (C++) int count();

private:
}

class D : B {
    extern (C++)int count() { return 10; }
}

extern (C++) B CreateB() {
    B inst = new D();
    core.memory.GC.addRoot(cast(void *)inst);
    return inst;
}