我该如何在C结构体中存储一个指向C++类的指针?
我正在使用一个基于C结构体的API(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 */
C++文件
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;
}
reinterpret_cast
)。因此,问题必须出现在未显示的代码中。因此,您需要在阅读stackoverflow.com的[帮助]并了解提供[mre]的要求后,编辑您的问题,以便任何人都可以编译和运行它们自己,以重现您的问题。否则,没有人能够帮助您。 - Sam Varshavchikdelete
一样。 - PaulMcKenzietemp= MidiToOneToneTranslator_New(4);
这行代码中函数的声明不可见(你将声明隐藏在了__cplusplus
测试后面)。段错误可能是尝试运行错误代码的结果。如果你没有看到错误消息,请检查你的编译器设置(或者检查你是否真的发布了真实的代码)。 - M.M.c
文件中,你从未包含函数声明。extern "C"
行只包含在你的.cpp
文件中。你使用了#if defined __cplusplus
来使头文件在不同的包含方式下看起来不同。 - M.M