2

我在我的项目中使用了普通的指针。我遇到了一些内存问题并更改了weak_ptr的普通指针。我有错误:

错误:“->”的基本操作数具有非指针类型“boost::weak_ptr”</p>

为什么?我应该怎么办?

4

2 回答 2

5

首先,锁定 weak_ptr - 如果它没有过期,你会得到适当的shared_ptr

shared_ptr<my_type> p = weak.lock();
if (p)
  p->do_something();
else
  // expired!
于 2013-08-18T18:06:09.023 回答
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>被告知另一个对象被释放。要使用 a 指向的对象std::weak_ptr<T>,您需要std::shared_ptr<T>在确保它确实指向仍然存在的对象之后将其转换为 a (如果从 a 引用的对象std::weak_ptr<T>在转换为 a 时不再存在std::shared_ptr<T>,则异常被抛出)。

相同的语义适用于这些类模板的 Boost 版本:标准类模板是在 Boost 模板之后建模的。

于 2013-08-18T15:11:06.847 回答