2012-03-29 1076 views
5

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

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。

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

+1

您可以将观察者存储在同时包含观察者和'shared_ptr'的类中。这可以确保观察者的生命周期在'shared_ptr'拥有的对象的生命周期中被匹配或超过。另外,为什么不存储'shared_ptr'本身的地址,而不是存储指向对象的地址? – Mankarse 2012-03-29 03:29:37

+0

我发现了一个破解包含shared_ptr并将结构转换为void *的结构。不知道我对此解决方案的感受如何。另外,我在某个论坛上看到你不应该使用shared_ptr的地址。 – 2012-03-29 03:37:09

+0

@ user1229962:你将'void *'传递给了什么? – 2012-03-29 04:45:08

回答

4

这样做的唯一方法是分配一个shared_ptr某处足够长的时间,然后将void*设置为指向该位置。

0

尝试weak_ptr

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

编辑:对不起,我没有正确读取的问题;你可以尽量保持它的范围,因此不会得到清理

更新:如果您在通话后引用变量A弱指针可实际工作,因为这样编译器不能优化a_string的shared_ptr的破坏(因此,防止DECR引用计数为零 - >释放)你利用底层指针的

,所以你能做到这一点之前:

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 d之外的某处引用epending上下文和你正在与空指针做(如果它创建一个新的副本或经营上的空白数据)

+1

weak_ptr不会增加use_count,因此内存仍将被释放。 weak_ptr将如何提供帮助? – 2012-03-29 03:22:24

+1

更新了我的回复。 – 2012-03-29 03:32:08

1

如果你施放void*boost::shared_ptr,这将是一个新的共享指针,没有链接到任何其他指向`void*变量指向的内存的共享指针。

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

这使您可以通过类中的成员函数(shared_from_this)获得将与现有shared_ptrs共享所有权的shared_ptr。

查看boost enabled_shared_from_this docs了解更多详情。

相关问题