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

问题描述 投票:0回答:3

我正在开发一个 C 语言应用程序,我需要使用第三方 C++ 库。因此,我基本上是在 C++ 库周围编写一个包装器,以便可以从纯 C 语言的应用程序中调用它。库中的一些方法返回类型为

boost::shared_ptr
的指针,我需要将其转换为
 void*
[对于 C],然后将其转换回
boost::shared_ptr
类型以重复使用以进行进一步处理。我使用以下方法进行转换:

void*

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

但是,我在

SIGSEGV
中得到了
func2
,我相信这是因为
shared_ptr
被释放,因为它的引用计数为 0。

我一直在寻找进行此转换的正确方法以及 SO 社区专家的建议。

c++ c boost
3个回答
8
投票

考虑谁拥有 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实例,这可能不安全。请参阅此处:从共享指针中分离指针?

将其传回:

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

2
投票

如今,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 */

1
投票

做什么取决于 C 库对

void*
指针的作用。如果它在某些时候被用作
T*
那么这就是你需要传递的,就像你正在做的那样。要返回
shared_ptr
,您需要
T
来实现
boost::enable_shared_from_this
,并调用其
shared_from_this
成员函数,即
reinterpret_cast<T*>(void_ptr)->shared_from_this()

© www.soinside.com 2019 - 2024. All rights reserved.