如何在 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_cast
从 void*
进行转换。
您可以使用包装器,例如:
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/