本次主要是补充一下智能指针章节的遗漏部分——weak_ptr指针

       weak_ptr是C++11中引入的一种智能指针,它的作用就是配合shared_ptr对资源进行管理。由于weak_ptr设计的作用就是配合shared_ptr,因此其是一种“弱引用”,本身并不会增加所指对象的引用计数,也不会影响所指对象的生命周期。

       weak_ptr通常用于解决shared_ptr的循环引用问题。当两个或者更多shared_ptr互相引用时,会形成一个循环引用,类似死锁的一种产生方式,此时会导致所指向对象无法被释放,从而产生内存泄漏。这时我们可以使用weak_ptr破除循环引用,将其中一个shared_ptr转换为weak_ptr,使得它不在持有该对象的所有权,从而避免内存泄漏。

       使用weak_ptr时,需要用到weak_ptr中lock()函数,该函数可以获取一个shared_ptr对象,如果此时weak_ptr指向的对象已经被销毁,lock函数会返回一个空的shared_ptr对象。

下面给出一个使用weak_ptr的示例:

class B {
public:
	B(int value) : value_(value)
	{}
	int getValue() const
	{
		return value_;
	}
private:
	int value_;
};
class A {
public:
	void setB(shared_ptr<B> b) 
	{ 
		pb_ = b; 
	}
	void doSomething() 
	{
		if (auto p = pb_.lock())//看shared_ptr对象是否被销毁
			cout << "A::doSomething() called, B's value is " << p->getValue() << endl;
		else 
			cout << "B has been deleted" << endl;
	}
private:
	weak_ptr<B> pb_;
};
int main() {
	shared_ptr<A> pa = make_shared<A>();//先创建对象A和B
	shared_ptr<B> pb = make_shared<B>(42);
	pa->setB(pb);//将对象B传递给A(这里使用weak_ptr传递)
	pa->doSomething();
	pb.reset();//对B对象计数器--,变为0,直接销毁
	pa->doSomething();
	return 0;
}

此时输出结果:

智能指针补—weak_ptr_智能指针

以上就是weak_ptr的基本使用方法,也是为了补充上章没有总结到的一些知识点。