c++ - 我可以在 C 中存储指向 C++ 类的指针吗?

标签 c++ c extern

如何在 C 结构中存储指向 C++ 类的指针?

我正在使用一个 API,其中的基本存储单元是 C 结构 (MaxMSP)。我想使用 C++。我试图在 void* 中存储指向我的类的指针,但删除它(在 C++ 中)会导致崩溃

extern "C" void* MyClass_New(){
     MyClass* temp = new MyClass();
     return (void*)temp;
}

extern "C" void MyClass_Delete(void* myclass){
      delete (MyClass*)myclass;  //<--- this line crashes.
}

我知道这既丑陋又危险,但我看不到另一种方法可以做到这一点。你呢?

我预计 void* 会充分跟踪 C++ 类,但在强制转换后调用 delete void* 会导致崩溃。

///////这是我的最小可重现性。

.c:

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

    void* temp;
    temp= MyClassTranslator_New(4);   
    MyClassTranslator_Kill(temp);


    return 0;
}

.hpp

#ifndef m2ot_base_hpp
#define m2ot_base_hpp


#if defined __cplusplus



extern "C" class MyClassTranslator
{

    private :
        long num;

    public:
        MyClassTranslator(const long num);
        ~MyClassTranslator(){;};
        MyClassTranslator( const MyClassTranslator &obj);


        long getNum(void){return this->num;};


};

extern "C"  void* MyClassTranslator_New(const long num);

extern "C"  void MyClassTranslator_Kill(void* thisc);


#endif

#endif /* m2ot_base_hpp */

.cpp



MyClassTranslator::MyClassTranslator( const MyClassTranslator &that){
    this->num=that.num;
}

extern "C"  void* MyClassTranslator_New(const long num)
{
    MyClassTranslator* temp= new MyClassTranslator(num);

    return static_cast<void*> (temp);
}

extern "C"  void MyClassTranslator_Kill(void* thisc){
    delete static_cast<MyClassTranslator*>(thisc);
}


MyClassTranslator::MyClassTranslator(const long num){
    this->num=num;
}

最佳答案

Can I store pointers to C++ classes in C?

是的。

but deleting it (in C++) causes a crash

有几种可能性:

  • 您传递了一个指向 MyClass_Delete 的指针,该指针并非源自 MyClass_New
  • 您不止一次将同一个指针传递给 MyClass_Delete
  • 类的析构函数崩溃。

关于风格:

MyClass_New 中的转换是多余的。

我建议不要在 C++ 中使用 C 风格转换。您可以使用 static_castvoid* 进行转换。

您可以使用包装器,例如:

struct MyClass_handle {
    void* ptr;
};
struct MyClass_handle MyClass_New();
void MyClass_Delete(struct MyClass_handle myclass);

使用类型句柄可以更容易地捕捉到不正确的用法。

关于c++ - 我可以在 C 中存储指向 C++ 类的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57351748/

相关文章:

c++ - 调试 CUDA 代码

c - 静态函数的外部声明是否会破坏内部链接?

c - extern全局变量示例-错误

c++ - addByteLength() 不添加字节以在 omnet++ 中发送消息

c++ - 如何解决重载成员函数问题的地址?

c++ - 如何修复 C++ 中的 'Heap has been corrupted ' 错误?

c++ - 我的 C++ 程序正在打印地址而不是值

c++ - GCC 不会删除未使用的函数

python - Cython 将字符串作为字节传递给 C

c++ - 用 extern 尝试一些简单的事情