我在项目中使用普通指针。我有一些内存问题,并改变了weak_ptr的普通指针。我有错误:
错误:' - >'的基本操作数有非指针类型'boost :: weak_ptr'
为什么呢?我该怎么办?
答案 0 :(得分:4)
您不想使用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::weak_ptr<T>
。 1}}在将其转换为std::shared_ptr<T>
时不再存在,会抛出异常。
相同的语义适用于这些类模板的Boost版本:标准类模板是在Boost版本之后建模的。
答案 1 :(得分:2)
首先,锁定weak_ptr - 如果它没有过期,你将获得适当的shared_ptr
:
shared_ptr<my_type> p = weak.lock();
if (p)
p->do_something();
else
// expired!