我在我的项目中使用了普通的指针。我遇到了一些内存问题并更改了weak_ptr的普通指针。我有错误:
错误:“->”的基本操作数具有非指针类型“boost::weak_ptr”</p>
为什么?我应该怎么办?
我在我的项目中使用了普通的指针。我遇到了一些内存问题并更改了weak_ptr的普通指针。我有错误:
错误:“->”的基本操作数具有非指针类型“boost::weak_ptr”</p>
为什么?我应该怎么办?
首先,锁定 weak_ptr - 如果它没有过期,你会得到适当的shared_ptr
:
shared_ptr<my_type> p = weak.lock();
if (p)
p->do_something();
else
// expired!
你不想用它std::weak_ptr<T>
来维护内存。实际上,它用于尽快释放内存,同时如果在其他地方使用对象,则可以检索该对象。根据您的所有权语义,您希望std::unique_ptr<T>
用于对象的单个所有者或对象std::shared_ptr<T>
的共享所有权。
的想法std::weak_ptr<T>
是,如果对象确实存在,您可能需要找到它们,但您不想紧紧抓住这些对象。也就是说,如果std::shared_ptr<T>
一个对象没有其他所有者,即 ,则该对象被释放,尽管有一个std::weak_ptr<T>
指向它的对象。然而,std::weak_ptr<T>
被告知另一个对象被释放。要使用 a 指向的对象std::weak_ptr<T>
,您需要std::shared_ptr<T>
在确保它确实指向仍然存在的对象之后将其转换为 a (如果从 a 引用的对象std::weak_ptr<T>
在转换为 a 时不再存在std::shared_ptr<T>
,则异常被抛出)。
相同的语义适用于这些类模板的 Boost 版本:标准类模板是在 Boost 模板之后建模的。