将sharedptr铸造提升为void*

boost shared_ptr casting to void*

本文关键字:void sharedptr      更新时间:2023-10-16

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

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。

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

实现这一点的唯一真正方法是将shared_ptr分配到某个可以使用足够长时间的位置,然后将void*设置为指向该位置。

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

我认为您需要做的是将enabled_shared_from_this支持添加到您正在考虑与该代码的shared_ptrs一起使用的类中。

这允许您获得一个shared_ptr,它将通过类上的成员函数(shared_from_this)与现有的shared_ptrs共享所有权。

有关更多详细信息,请参阅boost enabled_shared_from_this文档。

尝试weak_ptr:

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

编辑:对不起,我没有正确阅读问题;你可以试着把它保持在范围内,这样它就不会被清除

更新:如果您在调用后引用变量,弱指针实际上可能会起作用,因为在您使用底层指针之前,编译器无法优化对a_string shared_ptr的破坏(因此防止decc refcount为零->发布)

所以你可以这样做:

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数据进行操作)