如何在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++类,但是在强制转换为void *之后调用delete会导致崩溃。
///////这是我的最低可复制性。
。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;
}
最佳答案
是。
有几种可能性:
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/