C++共享指针引用计数的变化规则
时间: 2025-09-06 16:45:06 AIGC 浏览: 11
C++ 中共享指针(如 `std::shared_ptr`)引用计数的变化规则如下:
- **创建时**:当使用 `std::shared_ptr` 初始化一个新的共享指针指向一个对象时,该对象的引用计数初始化为 1。例如 `std::shared_ptr<int> ptr(new int(42));`,此时 `ptr` 指向的 `int` 对象引用计数为 1 [^1]。
- **拷贝构造**:若使用一个已存在的 `std::shared_ptr` 来初始化另一个 `std::shared_ptr`,引用计数会增加。如 `std::shared_ptr<int> ptr1 = ptr;`,此时 `ptr` 和 `ptr1` 共享同一个 `int` 对象,该对象的引用计数变为 2 [^1]。
- **赋值操作**:当进行赋值操作时,原指向对象的引用计数减 1,新指向对象的引用计数加 1。若原指向对象引用计数降为 0,则释放该对象。例如 `std::shared_ptr<int> ptr2(new int(10)); ptr1 = ptr2;`,`ptr1` 原指向对象引用计数减 1,`ptr2` 指向对象引用计数加 1 [^1]。
- **析构时**:当一个 `std::shared_ptr` 离开其作用域被析构时,它所指向对象的引用计数减 1。若引用计数降为 0,则释放该对象。例如函数结束时局部 `std::shared_ptr` 被析构 [^1]。
- **从容器获取**:当从容器中获取 `std::shared_ptr` 时,若创建新的 `std::shared_ptr` 实例来存储返回值,引用计数会增加。如调用 `l1.back()` 返回列表中最后一个元素(`std::shared_ptr<int>` 类型)的引用,将其存储在新的 `std::shared_ptr` 实例中,引用计数会增加以反映新的所有者 [^3]。
```cpp
#include <iostream>
#include <memory>
#include <vector>
int main() {
std::shared_ptr<int> ptr(new int(42));
std::cout << "Initial reference count: " << ptr.use_count() << std::endl;
std::shared_ptr<int> ptr1 = ptr;
std::cout << "Reference count after copy construction: " << ptr.use_count() << std::endl;
std::shared_ptr<int> ptr2(new int(10));
ptr1 = ptr2;
std::cout << "Reference count of original object after assignment: " << ptr.use_count() << std::endl;
std::cout << "Reference count of new object after assignment: " << ptr2.use_count() << std::endl;
std::vector<std::shared_ptr<int>> l1;
l1.push_back(ptr2);
std::shared_ptr<int> ptr3 = l1.back();
std::cout << "Reference count after getting from container: " << ptr2.use_count() << std::endl;
return 0;
}
```
阅读全文
相关推荐

















