我正在用C开发一个应用程序,我需要使用第三方C ++库。所以,我基本上是围绕C ++库编写一个包装器,以便可以从我的纯C应用程序中调用它。库中的一些方法返回类型为boost :: shared_ptr的指针,我需要将其转换为void * [for C]然后将其转换回boost :: shared_ptr类型以重用它以进行进一步处理。我使用以下方法进行转换:
无效*:
void * func1()
{
//after the boost::shared_ptr is created
return static_cast<void *> (SHARED_PTR.get())
}
来自void *:
void func2(void * VOID_PTR) //VOID_PTR returned by func1
{
boost::shared_ptr<T> SHARED_PTR = *(boost::shared_ptr <T> *)(VOID_PTR);
}
但是,我在func2中得到了SIGSEGV,我认为这是因为shared_ptr被释放,因为它的ref-count为0。
我一直在寻找这种转换的正确方法以及SO社区专家的建议。
提前致谢!
答案 0 :(得分:4)
考虑谁拥有T的实例,以及何时。
我猜你是从你的C ++库函数中获取shared_ptr,获取它的值,然后让shared_ptr超出范围。发生这种情况时,如您所建议的那样,托管对象将被删除。
要解决此问题,您必须在使用其托管对象的整个生命周期内保持原始shared_ptr处于活动状态。
void* func1(const boost::shared_ptr<T>& sharedPtr)
{
add_to_some_kind_of_persistent_storage(sharedPtr);
return static_cast<void*>(sharedPtr.get());
}
您还可以使用带有客户删除对象的技巧来有效地从shared_ptr释放托管对象,但如果有其他实例的shared_ptr挂起来管理同一个对象,则这可能不安全。见这里:Detach a pointer from a shared_ptr?
将其传回:
boost::shared_ptr<T> func2(void* voidPtr) //VOID_PTR returned by func1
{
return boost::shared_ptr<T>(voidPtr);
}
答案 1 :(得分:0)
如今,shared_ptr是标准库的一部分
std::shared_ptr<type> ptr;
auto ptr1 = reinterpret_cast<void *>(&ptr); /* shared_ptr > void ptr */
auto ptr2 = * reinterpret_cast(std::shared_ptr<type>*)(ptr1); /* void ptr > shared_ptr */
答案 2 :(得分:0)
该做什么取决于C库对PredType::C_S1
指针的处理方式。如果在某个时候将其用作PredType::NATIVE_CHAR
,那么这就是您需要通过的操作。要取回void*
,则需要T*
来实现boost::enable_shared_from_this
,并调用其shared_ptr
成员函数,即T
。