weak_ptr是一种弱引用的smart pointer. 它指向由shared_ptr管理的对象。这里的weak是指weak_ptr仅仅是指向该对象,并不会增加引用计数。而且,无法通过weak_ptr来直接操作对象,只能通过lock()
升级为share_ptr才可。感觉就是1条棉线,将weak_ptr与对象轻轻的绑定起来。
常用的操作有:
#include <iostream>
#include <memory>
struct Foo
{
Foo(int val = 0) : _val(val)
{
}
int _val;
};
void observe(std::weak_ptr<Foo> f)
{
if(auto p = f.lock())
{
┊ std::cout << "lock success: " << p->_val << std::endl;
┊ return;
}
std::cout << "the shared_ptr has been released:" << std::endl;
}
int main(int argc, char** argv)
{
std::weak_ptr<Foo> wp;
{
┊ auto sp = std::make_shared<Foo>(5);
┊ wp = sp;
┊ std::cout << "weak ptr user count: " << wp.use_count() << std::endl;
┊ observe(wp);
}
observe(wp);
std::cout << "weak ptr user count: " << wp.use_count() << std::endl;
return 0;
}
此外,weak_ptr还用于break 循环引用的问题。如cppreferance描述:
In addition, std::weak_ptr is used to break circular references of std::shared_ptr.
如《Linux服务器多线程编程》, owner持有指向child的shared_ptr,child持有指向owner的weak_ptr