将shared_ptr强制转换为void *

时间:2012-03-29 03:15:39

标签: c++ boost shared-ptr

我正在使用libev,它需要将我的数据转换为void *以符合其预定义的结构。我需要将boost :: shared_ptr强制转换为void *,然后将void *转换回boost :: shared_ptr。这是我的代码

void foo(boost::shared_ptr<string>& a_string)
{
 void* data = (void*)a_string.get();
 boost::shared_ptr<string> myString((string*)data);
}

我很确定这个工作正常,但是我的代码设置方式我相信所有对我的字符串的shared_ptr引用都超出了范围,因为这个转换方法不会增加use_count,因此shared_ptr释放内存而我仍然需要它。

有没有办法手动增加/减少use_count?理想情况下,当我转换为void *时,我会增加use_count,将我的void *传递给另一个函数,将void *转换回shared_ptr并减少use_count。

或者,如果有人知道这个问题的另一个解决方案,我可以使用任何帮助。

3 个答案:

答案 0 :(得分:4)

唯一真正的方法是将shared_ptr分配到足够长的某个地方,然后将void*设置为指向该地址。

答案 1 :(得分:1)

如果将void*强制转换回boost::shared_ptr,它将是一个新的共享指针,不会链接到任何其他指向{{1}指向的内存的共享指针变量。

我认为您需要做的是为您正在考虑使用带有该代码的shared_ptrs的类添加`void*支持。

这允许您通过类上的成员函数(enabled_shared_from_this)获取将与现有shared_ptrs共享所有权的shared_ptr。

有关详细信息,请参阅boost enabled_shared_from_this docs

答案 2 :(得分:0)

尝试weak_ptr

shared_ptr<int> p(new int(5));
weak_ptr<int> q(p);

修改:抱歉,我没有正确阅读问题;您可以尝试将其保留在范围内,以免被清理

更新:如果在调用后引用变量,弱指针实际上可能有效,因为编译器无法优化a_string shared_ptr的破坏(因此防止decr引用计数为零 - &gt; release)在使用底层指针

之前

所以你可以这样做:

void foo(boost::shared_ptr<string>& a_string)
{
 void* data = (void*)a_string.get();
 boost::shared_ptr<string> myString((string*)data);
 weak_ptr<string> temp(a_string); // prevent destruction before above line
 // or reference a_string in any meaningless way that CANT be optimised out 
 // pre-emptively by the compiler
}

a_string可能仍需要在foo之外的某处引用,具体取决于上下文以及您使用void指针执行的操作(如果它创建新副本或对void数据进行操作)< / p>