Effective Modern C++读书笔记:条款20

Aki 发布于 2023-01-15 230 次阅读


20对于类似std::shared_ptr但有可能空悬的指针使用std::weak_ptr:

如果需要某种智能指针能够像std::shared_ptr一样方便,但又无需参与管理所指涉到的对象的共享所有权的话。就很好适合用std::weak_ptr

但这样的功能同样会带来一个问题。这种指针需要处理一个对std::shared_ptr而言不是问题的问题:所指涉的对象有可能已经被析构。而std::weak_ptr的确是可以判断所指向对象是否还存在。

在看完std::weak_ptr的API后,你可能会困惑,这东西不能取地址,也不能检查是否为空。这东西到底有什么用呢。其实这个东西需要配合std::shared_ptr使用,相当于std::shared_ptr的一种扩充。

用途示例,一般std::weak_ptrstd::shared_ptr创建:


auto ptr = make_shared<int>(10);   //完成ptr的构造,引用计数为1
weak_ptr p(ptr);                   //p和ptr指向同一个int,引用计数保持为1
ptr = nullptr;                     //引用计数为0,int对象被析构,ptr悬空
if (p.expired())                   //用来判断是否悬空
{
	cout << "null" << endl;
}
else
{
	cout << "exist" << endl;
}

请记住:

  • 使用std::weak_ptr来代替可能空悬的std::shared_ptr
  • std::weak_ptr可能的用武之地包括缓存、观察者列表、以及避免std::shared_ptr指针环路