我正在使用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。
或者如果有人知道这个问题的另一种解决方案,我可以使用任何帮助。
您可以将观察者存储在同时包含观察者和'shared_ptr'的类中。这可以确保观察者的生命周期在'shared_ptr'拥有的对象的生命周期中被匹配或超过。另外,为什么不存储'shared_ptr'本身的地址,而不是存储指向对象的地址? – Mankarse 2012-03-29 03:29:37
我发现了一个破解包含shared_ptr并将结构转换为void *的结构。不知道我对此解决方案的感受如何。另外,我在某个论坛上看到你不应该使用shared_ptr的地址。 – 2012-03-29 03:37:09
@ user1229962:你将'void *'传递给了什么? – 2012-03-29 04:45:08