gpt4 book ai didi

c++ - 我可以在 C 中存储指向 C++ 类的指针吗?

转载 作者:太空狗 更新时间:2023-10-29 21:31:46 24 4
gpt4 key购买 nike

如何在 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++ 类,但在强制转换后调用 delete void* 会导致崩溃。

///////这是我的最小可重现性。

.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;
}

最佳答案

Can I store pointers to C++ classes in C?

是的。

but deleting it (in C++) causes a crash

有几种可能性:

  • 您传递了一个指向 MyClass_Delete 的指针,该指针并非源自 MyClass_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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com