boost::shared_ptr为void*,反之亦然 我在C开发了一个应用程序,在这里我需要使用第三方C++库。所以,我基本上写了一个包装器,围绕C++库,使它可以从纯C的应用程序调用它。库中的一些方法返回类型为Booo::SyrdypTR的指针,我需要将它强制转换为[C],然后将其转换为Booo::SyrdypTR类型,以便重用它以进行进一步的处理。我使用以下方法进行转换:
作废*:boost::shared_ptr为void*,反之亦然 我在C开发了一个应用程序,在这里我需要使用第三方C++库。所以,我基本上写了一个包装器,围绕C++库,使它可以从纯C的应用程序调用它。库中的一些方法返回类型为Booo::SyrdypTR的指针,我需要将它强制转换为[C],然后将其转换为Booo::SyrdypTR类型,以便重用它以进行进一步的处理。我使用以下方法进行转换:,c++,c,boost,C++,C,Boost,作废*: void * func1() { //after the boost::shared_ptr is created return static_cast<void *> (SHARED_PTR.get()) } void*func1() { //创建boost::shared_ptr之后 返回静态\u转换(共享\u PTR.get()) } 从空*: void func2(void * VOID_PTR) //VOID_PTR returned by f
void * func1()
{
//after the boost::shared_ptr is created
return static_cast<void *> (SHARED_PTR.get())
}
void*func1()
{
//创建boost::shared_ptr之后
返回静态\u转换(共享\u PTR.get())
}
从空*:
void func2(void * VOID_PTR) //VOID_PTR returned by func1
{
boost::shared_ptr<T> SHARED_PTR = *(boost::shared_ptr <T> *)(VOID_PTR);
}
void func2(void*void\u PTR)//func1返回的void\u PTR
{
boost::shared_ptr shared_ptr=*(boost::shared_ptr*)(VOID_ptr);
}
然而,我在func2中得到了SIGSEGV,我相信这是因为共享的ptr被释放,因为它的ref计数为0
我一直在寻找正确的方法来进行这种转换,并从SO社区的专家那里寻求建议
提前谢谢 想想谁拥有T的实例,以及何时拥有 <>我猜你从C++库函数中得到了一个SyddypTR,得到它的值,然后让SydDypTR超出范围。当发生这种情况时,正如您所建议的,托管对象将被删除 要解决这个问题,您必须在使用其托管对象的生命周期内保持原始共享\u ptr的活动状态
void* func1(const boost::shared_ptr<T>& sharedPtr)
{
add_to_some_kind_of_persistent_storage(sharedPtr);
return static_cast<void*>(sharedPtr.get());
}
void*func1(const boost::shared_ptr&sharedPtr)
{
添加某种类型的持久存储(sharedPtr);
返回static_cast(sharedPtr.get());
}
您还可以对customer deleter对象使用技巧,从共享的\u ptr中有效地释放托管对象,但是如果有其他共享的\u ptr实例挂起管理同一对象,这可能不安全。请看这里:
要将其传回,请执行以下操作:
boost::shared_ptr<T> func2(void* voidPtr) //VOID_PTR returned by func1
{
return boost::shared_ptr<T>(voidPtr);
}
boost::shared_ptr func2(void*voidPtr)//由func1返回的void_ptr
{
返回boost::共享的ptr(voidPtr);
}
如今,共享的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 */
std::shared_ptr ptr;
自动ptr1=重新解释强制转换(&ptr);/*共享\u ptr>无效ptr*/
自动ptr2=*重新解释强制转换(标准::共享ptr*)(ptr1);/*无效ptr>共享ptr*/
该做什么取决于C库如何使用void*
指针。如果它在某个点被用作T*
,那么这就是您需要传递的内容,因为您正在这样做。要获取shared\u ptr
您需要T
来实现,并从成员函数调用其shared\u,即reinterpret\u cast(void\u ptr)->shared\u from\u this()
反向转换真的应该是一个初始化吗?例如boost::shared\u ptr(VOID\u ptr)
?不。那么你会有两个智能指针,都有责任删除该指针。@cheers-sandhth.-Alf“那么你会有两个智能指针”我不认为你会有任何东西:如果你不能做delete p代码>你怎么做boost::shared_ptr(p)
?为什么在这里使用reinterpret_cast
?auto ptr2=*reinterpret_cast(ptr1);