Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以存储指向C++;C语言的课程?_C++_C_Extern - Fatal编程技术网

C++ 我可以存储指向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

我正在使用一个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*)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);