【发布时间】:2012-04-12 16:49:55
【问题描述】:
我正在使用 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。
或者如果有人知道这个问题的另一种解决方案,我可以使用任何帮助。
【问题讨论】:
-
您可以将观察者存储在一个包含观察者和
shared_ptr的类中。这将确保观察者的生命周期与shared_ptr拥有的对象的生命周期相匹配或超过。另外,为什么不存储shared_ptr本身的地址而不是存储指向对象的地址呢? -
我通过创建一个包含 shared_ptr 的结构并将该结构转换为 void* 找到了一个技巧。不确定我对这个解决方案的感觉如何。另外,我在某个论坛上看到你不应该使用 shared_ptr 的地址。
-
@user1229962:你将
void*传递给什么? -
void* 在事件回调中被传递回 SharedPointer
。到那时,原始的 SharedPointers 都超出了范围。我想我只需要在堆上分配一个 shared_ptr 并将其传递给 void,然后在回调中删除它。
标签: c++ boost shared-ptr