2013-12-14 121 views
3

我正在C开发一个应用程序,我需要使用第三方C++库。所以,我基本上是围绕C++库编写一个包装器,以便可以从纯C中的应用程序调用它。库中的一些方法返回类型为boost :: shared_ptr的指针,我需要将其转换为void * [for C],然后将其转换回boost :: shared_ptr类型以重用它以进行进一步处理。我用下面的方法来进行转换:boost :: shared_ptr void *反之亦然

到void *:

void * func1() 
{ 
    //after the boost::shared_ptr is created 
    return static_cast<void *> (SHARED_PTR.get()) 
} 

从无效*:

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被取消分配,因为它的引用计数变为0.

我一直在寻找正确的方法来完成这个转换和来自SO社区专家的建议。

在此先感谢!

+1

不宜背铸真的是初始化呢?如'boost :: shared_ptr (VOID_PTR)'? – 2013-12-14 11:36:26

回答

0

一种可能的方式是:

void func2(void * VOID_PTR) //VOID_PTR returned by func1 
{ 
    boost::shared_ptr<T> SHARED_PTR(static_cast<T*>(VOID_PTR)); 
} 

请记住,当你正在做shared_ptr-> void *的转换,你是回避的引用计数,也就是说,它可能是您的无效*指针将是无效的在一个点上。

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