我在项目中使用了普通指针。我的内存出现了一些问题,并将普通指针改为weak_ptr。我有错误:
错误:"->"的基操作数具有非指针类型"boost::weak_ptr"
为什么?我该怎么办?
首先,锁定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>
会被告知其他对象正在被释放。要使用由std::weak_ptr<T>
指向的对象,您需要在确保它确实指向一个仍然活动的对象后将其转换为std::shared_ptr<T>
(如果在将其转换成std::shared_ptr<T>
时,从std::weak_ptr<T>
引用的对象不再存在,则会引发异常)。
相同的语义适用于这些类模板的Boost版本:标准类模板是在Boost模板之后建模的。