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_ptr
由std::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指针环路
Comments NOTHING