C++ 我可以存储指向C++;C语言的课程?
我正在使用一个API,其中存储的基本单元是C结构(MaxMSP)。我想用C++。我试图将指向我的类的指针存储在一个空*中,但删除它(在C++中)会导致崩溃C++ 我可以存储指向C++;C语言的课程?,c++,c,extern,C++,C,Extern,我正在使用一个API,其中存储的基本单元是C结构(MaxMSP)。我想用C++。我试图将指向我的类的指针存储在一个空*中,但删除它(在C++中)会导致崩溃 extern "C" void* MyClass_New(){ MyClass* temp = new MyClass(); return (void*)temp; } extern "C" void MyClass_Delete(void* myclass){ delete (MyClass*)myclas
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.
}
.水电站
.cpp
MyClassTranslator::MyClassTranslator(constMyClassTranslator&that){
this->num=that.num;
}
外部“C”无效*MyClassTranslator_新(常量长数值)
{
MyClassTranslator*temp=新的MyClassTranslator(num);
返回静态铸件(温度);
}
外部“C”无效MyClassTranslator_Kill(无效*此C){
删除静态_cast(thisc);
}
MyClassTranslator::MyClassTranslator(const long num){
这个->num=num;
}
我可以在C?< /P >中存储指针到C++类吗? 对
但是(在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.
}
有几种可能性:
- 您传递了一个指向
的指针,该指针不是源于MyClass\u Delete
MyClass\u New
- 您多次将同一指针传递给
MyClass\u Delete
- 类的析构函数崩溃
关于风格: 强制转换
MyClass\u New
是冗余的
我建议不要在C++中使用C风格的CAST。您可以使用static\u cast
从void*
转换
您可以使用包装器,例如:
struct MyClass_handle {
void* ptr;
};
struct MyClass_handle MyClass_New();
void MyClass_Delete(struct MyClass_handle myclass);
使用类型化句柄更容易捕获不正确的用法。我希望这能起作用(尽管学究式需要使用
重新解释转换)。所以,问题一定出在没有显示的代码中。因此,在阅读stackoverflow.com之后,您将被要求回答您的问题,并理解提供任何人都可以自己编译和运行的要求,以便重现您的问题。否则,任何人都无法帮助您。如果您只是简单地调用Myclass\u New
,然后立即调用Myclass\u Delete
,您会遇到同样的问题吗?如果不是,那么,正如前面所述,您的问题与您没有向我们展示的代码有关,这些代码发生在调用之间(比如不正确的指针/内存管理)。@paul实际上我正是这么做的。我从来没有写过很多代码,这只是一个测试。然后你需要知道你正在创建的类的内部源代码。如果构造函数和/或析构函数都有错误,那么你当然会有奇怪的行为,如果我给你一个有错误的析构函数的类,你在.c
文件中调用delete
@Audiomatt,那就没什么不同了,你从来没有包含函数声明。extern“C”
行仅包含在.cpp
文件中。您使用了#if defined uu cplusplus
使标题在以每种方式包含时看起来都不同。我在上面包含了我的代码。我不认为自己做了这么蠢的事,但就像我在别处说的那样,我是一个beginner@Audiomatt我看不出你的代码有什么问题。我建议创建一个包含最小可复制的。原谅.c文件中的必要API代码,相关的测试代码在底部。@ AudioMaTT的例子对我来说很好:我不知道为什么,但是WangBox可能已经编译了C文件作为C++,尽管它没有抱怨缺少声明函数。我不知道一个联机工具,把C和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;
}
struct MyClass_handle {
void* ptr;
};
struct MyClass_handle MyClass_New();
void MyClass_Delete(struct MyClass_handle myclass);