当前位置: 首页 > news >正文

【CI130x 离在线】C++ 11智能指针 std::unique_ptr

std::unique_ptr 是 C++11 引入的特性!

C++ 智能指针的发展历程

版本 年份 智能指针特性
C++98 1998 std::auto_ptr(有缺陷,已废弃)
C++11 2011 ✅ std::unique_ptr
✅ std::shared_ptr
✅ std::weak_ptr
C++14 2014 std::make_unique 工具函数
C++17 2017 改进和优化

🤔 为什么叫"智能"指针?

智能指针之所以"智能",是因为它们比原始指针更聪明:

// 原始指针(笨拙)
std::thread* rawPtr = new std::thread([](){ /*...*/ });
// 需要手动管理内存,容易出错
delete rawPtr;  // 容易忘记!// 智能指针(聪明)
std::unique_ptr<std::thread> smartPtr = std::make_unique<std::thread>([](){ /*...*/ });
// 自动管理内存,不会泄露!

智能体现在

  • 🧠 自动内存管理:超出作用域时自动释放

  • 🧠 异常安全:即使抛出异常也能正确清理

  • 🧠 防止双重释放:有明确的所有权规则

🔑 为什么叫"unique"(独一无二)?

unique_ptr 的核心特性就是独占所有权

cpp
std::unique_ptr<std::thread> ptr1 = std::make_unique<std::thread>(/*...*/);// ❌ 不允许拷贝构造(编译错误)
std::unique_ptr<std::thread> ptr2 = ptr1;  // ✅ 允许移动构造(所有权转移)
std::unique_ptr<std::thread> ptr3 = std::move(ptr1);
// 现在 ptr3 拥有线程,ptr1 变为 nullptr

unique 的含义:

  • 🚫 不能拷贝:同一时间只有一个 unique_ptr 拥有该对象

  • 🔄 只能移动:所有权可以转移,但不能共享

  • 🎯 明确责任:很清楚谁负责释放内存

类比理解

// 就像现实生活中的"唯一钥匙":
std::unique_ptr<House> houseKey = getHouseKey();// ❌ 不能复制钥匙(不安全)
// std::unique_ptr<House> duplicateKey = houseKey;  // ✅ 可以把钥匙交给别人(转移所有权)
std::unique_ptr<House> newOwnerKey = std::move(houseKey);
// 现在原主人就没有钥匙了

所以总结来说:

  • 智能:因为它自动管理内存,比原始指针更聪明

  • unique:因为它独占资源,确保同一时间只有一个所有者

这样的设计既安全又高效!🎉

 

对比 C 语言的问题

C 语言中的传统做法:

pthread_t* processingThread = malloc(sizeof(pthread_t));
// ... 使用线程
// 容易忘记释放!
free(processingThread);  // 容易漏掉这行

可能的问题:

  1. 内存泄漏:忘记调用 free()

  2. 悬空指针:释放后继续使用

  3. 双重释放:多次释放同一内存

  4. 异常安全问题:在异常发生时无法保证资源释放

C++ 的解决方案

std::unique_ptr<std::thread> processingThread;// 自动管理生命周期
processingThread = std::make_unique<std::thread>([]() {// 线程逻辑
});// 不需要手动 delete!
// 当 processingThread 超出作用域时,会自动:
// 1. 调用 join()(如果需要)
// 2. 删除 thread 对象
// 3. 释放内存

核心优势

问题 C 语言 C++ unique_ptr
内存泄漏 ❌ 容易发生 ✅ 自动防止
异常安全 ❌ 需要额外处理 ✅ 自动保证
代码简洁性 ❌ 繁琐 ✅ 简洁
所有权明确 ❌ 不清晰 ✅ 非常清晰

所以说 unique_ptr 确实是 C++ 为了解决 C 语言中手动内存管理的各种痛点而设计的智能指针!🚀

http://www.rkmt.cn/news/45973.html

相关文章:

  • 第21天(简单题中等题 二分查找、排序)
  • 计算不确定度
  • File文件
  • 2025 年 11 月蔬菜配送厂家推荐排行榜,新鲜生鲜水果,有机食堂食材,生鲜蔬菜配送中心,蔬菜配送平台,新鲜蔬菜配送上门公司推荐
  • TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 使用Keras构建逻辑回归
  • 2025年保洁公司权威推荐榜单:驻场保洁/钟点保洁/开荒保洁/外包保洁/商场保洁/办公楼保洁/工厂保洁/医院保洁/企业保洁服务优选指南
  • 今天学的是编译型与解释型的运行流程
  • 2025 年 11 月 PFA 隔膜阀厂家推荐排行榜,PFA 隔膜阀,防腐隔膜阀,高纯隔膜阀,耐酸碱隔膜阀公司推荐
  • Django中使用应用自定义配置
  • 希尔排序快速排序归并排序
  • 2025 年 11 月粘度计厂家推荐排行榜,在线粘度计,旋转粘度计,振动粘度计,实验室旋转粘度计,反应釜在线粘度计公司推荐
  • flask: 用Flask-Uploads实现文件上传
  • 2025 年 11 月冲压件厂家推荐排行榜,新能源冲压件,光伏冲压件,精密冲压件,异形冲压件,五金冲压件,铝冲压件,汽配冲压件,不锈钢冲压件,家具冲压件公司推荐
  • 日总结 24
  • P4511 日程管理
  • 新编故事 | 噪音
  • 20232303 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • 2025 年 11 月润滑油厂家推荐排行榜,工业润滑油,汽车润滑油,发动机润滑油,甲醇发动机润滑油,全合成润滑油公司精选
  • 172. 阶乘后的零
  • 微服务已死?别再盲目跟风微服务!这3种情况下单体架构更适合你。
  • Oracle LogMiner实战指南:误删误改数据的救命稻草
  • Spring 事务 - 实践
  • Spring AI Alibaba 项目源码学习(二)-Graph 定义与描述分析
  • 20232422 2024-2025-1 《网络与系统攻防技术》实验四实验报告
  • SPI 设备与多从机冲突的解决之道:片选管理、CS 去抖与总线隔离策略 - 实践
  • pythontip 字符串转为字典
  • JavaWeb04-JUnit
  • 哪款学习机适合小学生用?2025年11月多款主流品牌告诉你如何选
  • AIGC系统
  • [GESP202303 二级] 百鸡问题