介绍一下std::shared_ptr
时间: 2025-08-06 14:21:13 浏览: 2
<think>我们正在回答用户关于std::shared_ptr的使用指南和功能介绍。根据引用的资料,我们可以总结如下:1.std::shared_ptr是一种共享所有权的智能指针,多个shared_ptr可以指向同一个对象,通过引用计数来管理对象的生命周期。2.当最后一个shared_ptr被销毁或重置时,对象会被自动删除。3.shared_ptr支持自定义删除器。4.同时,我们也要注意循环引用的问题,这时可以使用std::weak_ptr来打破循环。根据引用[1]和[3],我们可以知道shared_ptr的基本用法和引用计数的概念。引用[4]则展示了一个循环引用的例子,并暗示了如果不解决则会导致内存泄漏。下面我们将组织回答,包括:-shared_ptr的定义和基本用法-引用计数的概念-自定义删除器-循环引用问题及解决方案同时,按照系统指令,我们需要使用中文,数学表达式用$...$,独立公式用$$...$$,并在适当位置添加引用标识。最后生成相关问题。注意:引用[1]中提到了weak_ptr,但用户的问题是shared_ptr,所以我们以shared_ptr为主,在循环引用部分提及weak_ptr。另外,代码块使用```包围,并标注语言。</think>
### C++ `std::shared_ptr` 使用指南和功能详解
`std::shared_ptr` 是 C++11 引入的智能指针,用于解决动态内存管理的安全问题。其核心特性是**共享所有权**:多个指针可以同时指向同一个对象,系统通过内部引用计数自动管理对象生命周期[^1]。
#### 核心特性
1. **共享所有权机制**
多个`shared_ptr`可指向同一对象,引用计数跟踪所有者数量:
```cpp
std::shared_ptr<int> ptr1 = std::make_shared<int>(42); // 引用计数=1
std::shared_ptr<int> ptr2 = ptr1; // 引用计数=2
```
当最后一个`shared_ptr`离开作用域时,引用计数归零,自动释放内存[^3]。
2. **自定义删除器**
支持自定义内存释放逻辑:
```cpp
std::shared_ptr<FILE> logFile(fopen("log.txt", "w"),
[](FILE* fp){
fclose(fp);
std::cout << "File closed\n";
});
```
3. **循环引用解决方案**
需搭配`std::weak_ptr`避免循环引用导致的内存泄漏[^4]:
```cpp
class Child;
class Parent {
std::shared_ptr<Child> child;
};
class Child {
std::weak_ptr<Parent> parent; // 使用weak_ptr打破循环
};
```
#### 关键操作
| 方法 | 说明 |
|---------------------|----------------------------------------------------------------------|
| `use_count()` | 返回当前引用计数 |
| `reset()` | 释放所有权,减少引用计数 |
| `swap()` | 交换两个`shared_ptr`的所有权 |
| `get()` | 获取原始指针(慎用) |
#### 使用场景
1. 需要多个模块共享访问同一资源
2. 需要延长动态分配对象的生命周期
3. 实现缓存机制(需`weak_ptr`配合)
4. 需要异常安全的内存管理
> **最佳实践**:优先使用`std::make_shared`构造,比`new`更高效(单次内存分配)且异常安全[^1]。
阅读全文
相关推荐




















