如何在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_DeleteMyClass_New的指针。
  • 您多次向MyClass_Delete传递了相同的指针。
  • 类的析构函数崩溃。


  • 关于样式:
    MyClass_New中的强制转换是多余的。

    我建议不要在C++中使用C样式转换。您可以使用static_castvoid*转换。

    您可以使用包装器,例如:
    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/

    10-12 14:12