C++ unique_ptr独占智能指针用法_C++所有权语义的深入理解


unique_ptr是C++中独占式智能指针,定义于头文件,通过移动语义转移所有权,禁止拷贝,确保同一时间仅一个指针拥有资源,析构时自动释放,支持自定义删除器与数组特化,可安全与裸指针交互,推荐使用make_unique创建,能有效防止内存泄漏。

c++ unique_ptr独占智能指针用法_c++所有权语义的深入理解

在C++中,unique_ptr 是一种独占式智能指针,用于管理动态分配的对象。它确保同一时间只有一个 unique_ptr 拥有对资源的控制权,从而避免了资源泄漏和重复释放的问题。理解其所有权语义是掌握现代C++内存管理的关键。

什么是 unique_ptr?

std::unique_ptr 定义在 头文件中,是一个模板类,用来封装原始指针并自动管理其所指向对象的生命周期。当 unique_ptr 被销毁时,它会自动调用 delete(或自定义删除器)释放所拥有的资源。

它的核心特性是独占所有权:一旦一个 unique_ptr 拥有了某个对象,其他智能指针不能共享该所有权。这与 shared_ptr 不同,后者允许多个指针共享同一个对象。

基本用法与创建方式

使用 make_unique 是推荐的创建方式,因为它更安全且能避免异常安全问题(C++14起支持):

  • auto ptr = std::make_unique<int>(42);</int> —— 创建一个持有 int 的 unique_ptr
  • auto obj = std::make_unique<myclass>("hello", 100);</myclass> —— 构造复杂对象

也可以直接用构造函数绑定原始指针,但不推荐手动 new:

  • std::unique_ptr<int> ptr(new int(10));</int> —— 合法但不如 make_unique 好

访问所指对象使用常见的操作符:

  • *ptr —— 解引用获取值
  • ptr->method() —— 调用成员函数

所有权转移:移动而非复制

unique_ptr 禁止拷贝构造和拷贝赋值,因为这会破坏“独占”原则。但它支持移动语义:

  • std::unique_ptr<int> ptr1 = std::make_unique<int>(20);</int></int>
  • std::unique_ptr<int> ptr2 = std::move(ptr1);</int> —— 所有权从 ptr1 转移到 ptr2
  • 执行后,ptr1 变为 nullptr,不再拥有资源

这个机制使得 unique_ptr 可以作为函数返回值或参数传递(通过移动),同时保持资源的安全性:

// 函数返回 unique_ptr
std::unique_ptr<MyClass> createObject() {
    return std::make_unique<MyClass>();
}

// 接收 unique_ptr 参数(通过移动)

简小派 简小派

简小派是一款AI原生求职工具,通过简历优化、岗位匹配、项目生成、模拟面试与智能投递,全链路提升求职成功率,帮助普通人更快拿到更好的 offer。

简小派 103 查看详情 简小派
void useObject(std::unique_ptr<MyClass> obj) {
    obj->doSomething();
} // 自动析构

自定义删除器与数组支持

默认情况下,unique_ptr 使用 delete 释放资源,但你可以指定自定义删除器来处理特殊场景,比如调用 close() 或使用特定 API 释放资源:

auto closer = [](FILE* f) { if (f) fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(fopen("test.txt", "r"), closer);

对于数组,应使用数组特化版本,否则行为未定义:

  • std::unique_ptr<int> arr = std::make_unique<int>(10);</int></int>
  • 此时会自动调用 delete[] 而非 delete

访问元素使用下标操作符:arr[0] = 1;

与裸指针和其他智能指针交互

有时需要将 unique_ptr 交给外部系统(如C风格API),可以临时释放所有权:

  • ptr.release() —— 返回原始指针,并让 unique_ptr 放弃管理(返回前保持非空)
  • ptr.reset(new_value) —— 替换当前管理的对象,旧对象会被自动释放
  • ptr.get() —— 获取原始指针,但不转移所有权

注意不要用 get() 得到的指针去 delete,也不要把它再交给另一个智能指针,会造成双重释放。

如果确实需要共享所有权,可将 unique_ptr 移动到 shared_ptr 中:

  • std::shared_ptr<int> sp = std::move(up);</int> —— 合法且高效

基本上就这些。unique_ptr 设计简洁,性能接近裸指针,又能极大提升代码安全性。掌握它的移动语义和所有权规则,就能写出既高效又不易出错的C++程序。

以上就是C++ unique_ptr独占智能指针用法_C++所有权语义的深入理解的详细内容,更多请关注其它相关文章!


# seo  # 是一个  # 平邑网站建设  # seo网站标签大全  # 湖北食品推广营销策划  # 舟山营销推广报名网站官网  # 最好的网站建设系统  # 网站建设需求调研分析  # 无锡网站建设模板下载  # 网站建设专业建站  # seo网站推广方案有哪些内容  # 大众汽车品牌营销推广  # 头文件  # 如何实现  # 如何使用  # 尼克  # 但不  # 而非  # 特化  # 多核  # 自定义  # red  # c++ 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 在Flask应用中安全高效地更新SQLAlchemy用户数据  Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】  win11自带录屏文件保存在哪里 Win11 Game Bar录制视频默认路径【分享】  123平台官方登录入口 123邮箱网页端在线沟通工具  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  PHP实现等比数列:构建数组元素基于前一个值递增的方法  视频号视频怎么免费保存到相册?保存到相册需要注意什么?  Golang如何操作指针参数_Go pointer参数传递规则  高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法  铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明  PHP中获取HTTP响应状态消息:方法与限制  招商淘客入门指南  2025SNH48年度青春盛典门票价格及购买方式  PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】  微信如何设置字体大小_微信字体设置的阅读舒适  《画加》约稿流程  在Django单元测试中优雅处理信号:基于环境的条件执行策略  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  VS Code源代码管理(SCM)视图的进阶使用技巧  Win11怎么开启HDR_Windows 11显示器画质增强设置  京东快递包裹信息查询入口 京东快递官方查询平台入口  铁路12306座位怎么选_12306官方选座操作方法  荣耀盒子应用管理技巧  《小黑盒》删除历史浏览方法  除了Copilot,还有哪些值得一试的VS Code AI插件?  Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置  mysql中如何配置字符集和排序规则_mysql字符集排序配置  怎么恢复删除的电脑文件_数据恢复软件使用教程  TikTok视频播放中断怎么办 TikTok播放异常修复方法  蜻蜓FM如何设置移动流量播放  悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置  深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析  猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法  如何使用 Optional 类型并满足 Pylint 的类型检查  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  SQLAlchemy 2.0 与 Pydantic 模型类型安全集成指南  TikTok视频播放不流畅怎么办 TikTok视频播放优化方法  iphone16系列配置参数介绍  如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法  如何编写一个符合 composer 规范的 post-install-cmd 脚本?  虫虫助手如何更新游戏  《梦想世界:长风问剑录》药师一图流分享  实现二叉树的层序插入:基于树大小的路径导航  iPhone14无法连接蓝牙设备如何解决  Linux如何自动分析系统异常日志_Linux日志智能检测  Flexbox布局:实现粘性导航与底部页脚的完美结合  《地下城堡4:骑士与破碎编年史》墓穴挑战125攻略  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  顺丰快递在线查询系统 顺丰快递官方查单入口 

 2025-11-27

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.