C++中智能指针是如何工作的?

C++中的智能指针是基于**RAII(Resource Acquisition Is Initialization)**理念设计的自动化内存管理工具,通过对象生命周期管理资源。以下是三种核心智能指针的工作原理:


1. std::unique_ptr(独占所有权)

  • 核心机制:通过移动语义(Move Semantics)确保资源仅有一个所有者。

  • 所有权转移

    cpp 复制代码
    std::unique_ptr<int> ptr1 = std::make_unique<int>(10);
    std::unique_ptr<int> ptr2 = std::move(ptr1); // ptr1 释放所有权
  • 资源释放 :当unique_ptr离开作用域时,自动调用析构函数并释放内存。


2. std::shared_ptr(共享所有权)

  • 引用计数

    • 每个shared_ptr内部维护一个控制块(包含引用计数器和弱计数器)。
    • 复制时引用计数递增: \\text{ref_count} \\leftarrow \\text{ref_count} + 1
    • 析构时递减: \\text{ref_count} \\leftarrow \\text{ref_count} - 1
    • \\text{ref_count} = 0 时释放资源。
  • 示例

    cpp 复制代码
    auto p1 = std::make_shared<int>(20); // 引用计数=1
    {
      auto p2 = p1; // 引用计数=2
    } // p2析构,引用计数=1
    ``` // p1析构,引用计数=0,释放内存

3. std::weak_ptr(观察所有权)

  • 解决循环引用 :不增加引用计数,需通过lock()转为shared_ptr访问资源:

    cpp 复制代码
    std::weak_ptr<int> w_ptr;
    {
      auto s_ptr = std::make_shared<int>(30);
      w_ptr = s_ptr; // 不增加引用计数
    }
    if (auto tmp = w_ptr.lock()) { // 资源已释放,tmp为空
      // 操作资源
    }
    点击并拖拽以移动

关键操作对比

操作 unique_ptr shared_ptr weak_ptr
所有权独占
允许多引用
可直接访问资源 ✗¹
自动释放(零引用)

¹需通过lock()转为shared_ptr后访问


应用场景

  • unique_ptr:工厂模式返回对象、独占资源管理。
  • shared_ptr + weak_ptr:缓存系统、观察者模式。
  • 避免使用auto_ptr(C++17废弃,所有权转移不安全)。

智能指针通过自动化生命周期管理,显著降低了内存泄漏和悬垂指针的风险。

相关推荐
白山编程大哥6 分钟前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
_Twink1e16 分钟前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
devpotato23 分钟前
缓存与数据库更新顺序不一致问题
java·数据库·redis
xcl092534 分钟前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·spring boot·需求分析
Kyrie_kk44 分钟前
Java--IO--Path文件访问
java·后端
qinqinzqq1 小时前
Maven POM 格式、Schema 与 XSD:一篇讲透
java·maven
o盟1 小时前
maven本地仓库有 总是去私仓中下载
java·maven·intellij-idea
dong_junshuai1 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
devpotato1 小时前
Java 批量并发请求:从“能并发“到“结果按完成顺序可用“的三种写法与选型
java
雪的季节2 小时前
Multisim14.0的详细中文安装步骤【附安装包】
c++