Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
boost::shared_ptr为void*,反之亦然 我在C开发了一个应用程序,在这里我需要使用第三方C++库。所以,我基本上写了一个包装器,围绕C++库,使它可以从纯C的应用程序调用它。库中的一些方法返回类型为Booo::SyrdypTR的指针,我需要将它强制转换为[C],然后将其转换为Booo::SyrdypTR类型,以便重用它以进行进一步的处理。我使用以下方法进行转换:_C++_C_Boost - Fatal编程技术网

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