当前位置: 首页 > 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.jsqmd.com/news/37034/

相关文章:

  • Doxygen 入门
  • 第21天(简单题中等题 二分查找、排序)
  • CSAPP学习笔记(施工中)
  • 当Mb连不上虚拟机的时候,这是因为啥?我应该怎么解决?? - fish666
  • 计算不确定度
  • 会议开了一整天,记录却只有三行?
  • Day17盒子模型中设置外边距时的问题
  • 基于Github Action 配置Java Python Go. Rust Nodejs C++ 实现自动发布功能
  • File文件
  • 2025 年 11 月蔬菜配送厂家推荐排行榜,新鲜生鲜水果,有机食堂食材,生鲜蔬菜配送中心,蔬菜配送平台,新鲜蔬菜配送上门公司推荐
  • TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 使用Keras构建逻辑回归
  • 2025 年 11 月食堂承包厂家推荐排行榜:学校、工厂、企业、单位、医院、工地、科技园、工业园、产业园、养老院食堂承包公司精选
  • 2025年保洁公司权威推荐榜单:驻场保洁/钟点保洁/开荒保洁/外包保洁/商场保洁/办公楼保洁/工厂保洁/医院保洁/企业保洁服务优选指南
  • 今天学的是编译型与解释型的运行流程
  • 在线甘特图工具选型指南:5款产品深度对比评测
  • 2025 年 11 月食堂承包厂家推荐排行榜,学校食堂承包,工厂食堂承包,企业单位食堂承包,医院工地科技园食堂承包公司优选
  • 漏洞赏金实战:我是如何轻松获得2500美元奖金的
  • 华为网络设备重启-保存-清楚配置恢复出厂配置命令
  • 2025.11.10总结
  • 2025 年 11 月 PFA 隔膜阀厂家推荐排行榜,PFA 隔膜阀,防腐隔膜阀,高纯隔膜阀,耐酸碱隔膜阀公司推荐
  • 推荐一种异步线程执行过程中更新进度的方法
  • 2025 年 11 月食堂承包厂家推荐排行榜,学校食堂承包,工厂食堂承包,企业单位食堂承包,医院工地科技园食堂承包公司精选
  • 希尔排序快速排序归并排序
  • 2025 年 11 月电源适配器厂家推荐排行榜,12V2A电源适配器,12V电源适配器,24V电源适配器,笔记本电源适配器公司推荐
  • shadcn之表单
  • 2025 年 11 月粘度计厂家推荐排行榜,在线粘度计,旋转粘度计,振动粘度计,实验室旋转粘度计,反应釜在线粘度计公司推荐
  • Numpy - numpy.random.randn()
  • flask: 用Flask-Uploads实现文件上传
  • AI元人文:交织的智慧——应对价值困境的四条路径
  • 光学神经网络