shared_ptr和weak_ptr有什么区别?
时间: 2024-06-16 15:05:40 浏览: 129
C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)
5星 · 资源好评率100%
shared_ptr和weak_ptr是C++11中的智能指针,它们都用于管理动态分配的内存资源,但有一些区别。
1. 引用计数:shared_ptr使用引用计数来跟踪有多少个指针共享同一个对象。每当创建一个shared_ptr指向一个对象时,引用计数就会增加。当引用计数为0时,对象会被自动删除。而weak_ptr不会增加引用计数,它只是对shared_ptr的一个观察者,不会影响对象的生命周期。
2. 防止循环引用:shared_ptr可能会导致循环引用,即两个或多个对象相互持有shared_ptr指针,导致它们的引用计数永远不会变为0,从而导致内存泄漏。为了解决这个问题,可以使用weak_ptr。weak_ptr允许你观察shared_ptr指向的对象,但不会增加引用计数,因此可以避免循环引用。
3. 使用场景:shared_ptr适用于多个对象共享同一个资源的情况,例如在多个地方使用同一个动态分配的对象。而weak_ptr适用于需要观察shared_ptr指向的对象,但不需要拥有它的情况,例如在缓存中存储对象的引用。
下面是一个示例代码,演示了shared_ptr和weak_ptr的区别[^1]:
```cpp
#include <iostream>
#include <memory>
class B;
class A {
public:
std::weak_ptr<B> bptr;
~A() { std::cout << "~A()" << std::endl; }
};
class B {
public:
std::weak_ptr<A> aptr;
~B() { std::cout << "~B()" << std::endl; }
};
int main() {
std::shared_ptr<A> pa(new A());
std::shared_ptr<B> pb(new B());
pa->bptr = pb;
pb->aptr = pa;
return 0;
}
```
阅读全文