boost :: shared_ptr为void *,反之亦然

时间:2013-12-14 11:33:42

标签: c++ c boost

我正在用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社区专家的建议。

提前致谢!

3 个答案:

答案 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