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

在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 参数(通过移动)
Motiff妙多
Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”
334
查看详情
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推广
# 点点seo站长工具
# 山东东营网站推广
# 薯条推广营销策略研究
# 便宜的SEO优化
# seo技术大师
# 多线程
# seo
# 尼克
# 但不
# 而非
# 怎么做
# 重写
# 有什么
# 特化
# 自定义
# red
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?
谷歌google账号注册详细步骤 谷歌账号注册官方教程
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
微信网页版官方快速登录入口 微信网页版网页版账号直达
蛙漫官方正版入口 蛙漫网页在线全集免费观看
使用Pandas转换并合并DataFrame:多列映射至统一结构
夸克浏览器图书入口 夸克手机浏览器阅读入口
《主播少女的秘密账号迷宫》首支宣传片
J*aScript实现单选按钮与关联输入框的联动禁用教程
composer的"require-dev"部分是用来做什么的?
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
在VS Code中配置和运行Dart程序的完整步骤
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量
微信网页版扫码登录入口 微信网页版二维码登录入口
在Runstone环境中高效处理TasteDive API的JSON数据
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色
AO3官方在线访问地址 Archive of Our Own最新镜像合集
XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法
俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口
解决Django多数据库/多Schema环境下外键迁移问题
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
Python中高效访问嵌套字典与列表中的键值对
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
WordPress插件开发:正确注册卸载钩子与避免常见陷阱
苹果手机如何防止被恶意App追踪
在Socket.IO连接中实现Access Token自动更新与动态重连
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
excel如何生成目录 excel一键生成工作表目录超链接
《马克思佩恩3》早期版本曝光 UI设计曾多次调整!
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南


2025-11-27
浏览次数:次
返回列表