C++笔记之销毁、释放、转移与unique_ptr的所有权

📅 2026/7/6 3:32:58 👁️ 阅读次数 📝 编程学习
C++笔记之销毁、释放、转移与unique_ptr的所有权

C++笔记之销毁、释放、转移与unique_ptr的所有权


code review!

文章目录

  • C++笔记之销毁、释放、转移与unique_ptr的所有权
    • 1. C++动态内存管理中销毁和释放的含义
      • 1.1 概念定位不同
      • 1.2 在常用操作中的对应关系
        • 1.2.1 核心操作:`delete` 关键字
        • 1.2.2 显式拆分的情况
      • 1.3 对比总结表
      • 1.4 一个通俗的比喻
    • 2. std::unique_ptr的reset()、release()分别是销毁or释放?
      • 2.1 `release()` —— 既不销毁,也不释放
      • 2.2 `reset()` —— 既销毁,又释放
      • 2.3 总结对比
    • 3. unique_ptr转移堆内存所有权的方法
      • 3.1 使用 `std::move()`(推荐)
      • 3.2 使用 `release()` 配合 `reset()`
      • 3.3 函数参数传递(传值)
      • 3.4 函数返回值(最特殊、最优雅)
        • 3.4.1 为什么不需要写 `std::move`?
      • 3.5 总结:`std::unique_ptr` 所有权转移完整版
    • 4. p=nullptr等价于p.reset()?
      • 4.1 它们之间极其微小的区别
      • 4.2 编码建议
    • 5. 裸指针(Raw Pointer)与 unique_ptr 的转换
      • 5.1 什么是裸指针(Raw Pointer)?
      • 5.2 `std::unique_ptr` 与裸指针的互相转换
        • 5.2.1 裸指针 ➔ `unique_ptr`(获取管理权)
        • 5.2.2 `unique_ptr` ➔ 裸指针(借出或交出管理权)
      • 5.3 核心转换总结表

1. C++动态内存管理中销毁和释放的含义

在C++动态内存管理中,销毁(Destruction)释放(Deallocation/Freeing)是两个经常被一起提及、但底层逻辑完全不同的概念。

简单来说:销毁关注的是"对象生命周期的结束",而释放关注的是"内存空间的归还"。

可以通过以下几个核心维度来彻底搞懂它们的区别。

1.1 概念定位不同

  • 销毁 (Destruction)

    • 针对对象:它是面向对象层面的概念。
    • 核心工作:调用对象的析构函数(Destructor)。用于清理对象内部占用的资源(例如关闭文件句柄、释放对象内部自己new出来的其他内存、断开网络连接等)。
    • 结果:此时对象的生命周期正式结束,对象不再合法存在,但它曾经占用的那块内存空间还没有交还给操作系统。
  • 释放 (Deallocation)

    • 针对内存:它是系统/内存管理