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废弃,所有权转移不安全)。

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

相关推荐
Fuyo_11194 分钟前
C++中的活字印刷术——模板·初阶
开发语言·c++·笔记
小白|5 分钟前
cmake:昇腾CANN构建系统完全指南
java·c++·算法
王老师青少年编程6 分钟前
2026年全国青少年信息素养大赛“算法应用主题赛”(初赛)【C++考点大纲】(全场景、组别):文末附备考秘籍!
c++·全国青少年信息素养大赛·初赛·2026年·算法应用主题赛·考点大纲
Season4509 分钟前
C++之模板元编程(前置知识 constexpr)
开发语言·c++
weixin_5129761710 分钟前
Java 面试宝典 Beta5.0
java
Ting-yu13 分钟前
Spring AI Alibaba零基础速成(5) ---- Memory(记忆)
java·人工智能·后端·spring
月落归舟15 分钟前
一文掌握Spring AOP:从入门到底层原理
java·后端·spring
QuZhengRong18 分钟前
【Luck-Report】缓存
java·前端·后端·vue·excel
咩咦29 分钟前
C++学习笔记22:前置后置 ++/-- 和日期减日期
c++·学习笔记·运算符重载·日期类·前置++·后置++·日期减日期
XiYang-DING30 分钟前
【Spring】SpringMVC
java·后端·spring