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

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

相关推荐
v***913019 分钟前
Spring boot创建时常用的依赖
java·spring boot·后端
xlq223223 小时前
22.多态(上)
开发语言·c++·算法
代码or搬砖3 小时前
MyBatisPlus讲解(二)
java·mybatis
lcu1113 小时前
Java 学习42:抽象
java
Mr.朱鹏3 小时前
RocketMQ安装与部署指南
java·数据库·spring·oracle·maven·rocketmq·seata
雨中飘荡的记忆3 小时前
Spring表达式详解:SpEL从入门到实战
java·spring
Coder-coco3 小时前
个人健康管理|基于springboot+vue+个人健康管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·mysql·论文
D_evil__3 小时前
[C++高频精进] 并发编程:线程基础
c++
5***26224 小时前
Spring Boot问题总结
java·spring boot·后端
xkroy4 小时前
Spring Boot日志
java·spring boot·后端