本次主要是补充一下智能指针章节的遗漏部分——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,value,pb,shared,ptr,指针 From: https://blog.51cto.com/u_15209404/6458553