什么是weak_ptr
时间: 2023-09-02 09:10:05 浏览: 64
weak_ptr是C++11中引入的一种智能指针,用于协助shared_ptr进行资源管理。它是一种“弱引用”,不会增加所指对象的引用计数,也不会影响所指对象的生命周期。因此,当指向的对象被释放时,weak_ptr不会变成悬空指针,也不会引发内存泄漏。
weak_ptr通常用于解决shared_ptr的循环引用问题。当两个或多个shared_ptr相互引用时,会形成一个循环引用,导致所指对象无法被释放,从而产生内存泄漏。这时候可以使用weak_ptr来破除循环引用,将其中一个shared_ptr转换为weak_ptr,使得它不再持有对象的所有权,从而避免内存泄漏。
使用weak_ptr时,需要用lock()方法将其转换为shared_ptr,然后才能访问所指对象。如果所指对象已经被释放,lock()方法将返回一个空shared_ptr,表示对象不存在。
例如,下面是一个使用weak_ptr的示例:
```
class B;
class A {
public:
void setB(shared_ptr<B> b) { pb_ = b; }
void doSomething() {
if (auto p = pb_.lock()) {
cout << "A::doSomething() called, B's value is " << p->getValue() << endl;
} else {
cout << "B has been deleted" << endl;
}
}
private:
weak_ptr<B> pb_;
};
class B {
public:
B(int value) : value_(value) {}
int getValue() const { return value_; }
private:
int value_;
};
int main() {
shared_ptr<A> pa = make_shared<A>();
shared_ptr<B> pb = make_shared<B>(42);
pa->setB(pb);
pa->doSomething();
pb.reset();
pa->doSomething();
return 0;
}
```
在这个例子中,先创建了一个A对象和一个B对象,并将B对象的指针传递给A对象。在A对象中,pb_成员变量是一个weak_ptr,用于引用B对象。在A的doSomething()方法中,先用lock()方法将pb_转换为shared_ptr,然后再访问B对象的值。
在程序的后面,释放了B对象的指针,然后再次调用A的doSomething()方法。由于B对象已经被释放,因此lock()方法返回一个空shared_ptr,表示对象不存在。