c++中unique_ptr怎么移交所有权_c++ std::move用法【实战】
发布时间 - 2026-01-26 00:00:00 点击率:次std::unique_ptr不可复制只能移动,拷贝构造和赋值被删除;移交所有权需用std::move()标记为右值,此后源变为空,目标获得资源;函数传参或返回时应合理使用move,避免二次move等逻辑错误。
std::unique_ptr 不能复制,只能移动
这是所有问题的起点。如果你试图写 std::unique_ptr 或者传值给函数,编译器会直接报错:use of deleted function 'std::unique_ptr<_tp _dp>::unique_ptr(const std::unique_ptr<_tp _dp>&)'。因为 std::unique_ptr 的拷贝构造函数和拷贝赋值运算符都被显式删除了——它天生只允许一个指针拥有资源。
移交所有权必须用 std::move()
std::move() 不是真的移动内存,只是把左值

unique_ptr 的移动构造或移动赋值。没它,移交就卡死。
- 正确移交:
std::unique_ptr—— 此后p2 = std::move(p1); p1变成空(p1 == nullptr),p2持有原对象 - 函数返回时自动移动(C++11 起支持 RVO/NRVO,但显式
return std::move(p)一般不必要,甚至可能阻碍优化) - 传参给接受
std::unique_ptr值参数的函数时,调用方必须写func(std::move(p))
常见误用:对已空的 unique_ptr 再 move
不会崩溃,但容易引发逻辑错误。比如:
std::unique_ptrp = std::make_unique (42); auto p2 = std::move(p); // OK,p 现在为空 auto p3 = std::move(p); // 也编译通过,但 p3 是空的 —— 这不是你想要的“二次移交”
这种写法合法但无意义,p 已经释放了内部指针,再 std::move(p) 得到的仍是空 unique_ptr。真正要检查的是业务逻辑里是否误判了所有权状态。
立即学习“C++免费学习笔记(深入)”;
函数间传递 unique_ptr 的三种典型场景
移交不是目的,是配合资源生命周期管理的手段。关键看谁该负责释放:
- 工厂函数返回:直接
return std::make_unique,调用方自然获得所有权(...) - 函数获取并接管:参数声明为
void consume(std::unique_ptr,调用时写ptr) consume(std::move(ptr)) - 函数释放并交还:如果想让函数修改后还回所有权,返回类型用
std::unique_ptr,内部可安全移动局部变量或重新std::make_unique
别忘了:一旦移交,原变量不再持有资源,解引用前务必用 if (p) 或 p != nullptr 判断。
# c++
# 运算符
# 赋值运算符
# if
# 构造函数
# const
# 局部变量
# void
# 指针
# 值参数
# function
# 对象
# 为空
# 的是
# 这是
# 如果你
# 这不是
# 仍是
# 三种
# 想让
# 别忘了
# 报错
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在阿里云完成域名注册与建站?
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
香港服务器WordPress建站指南:SEO优化与高效部署策略
Linux系统运维自动化项目教程_Ansible批量管理实战
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
简单实现Android验证码
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
Android Socket接口实现即时通讯实例代码
如何用搬瓦工VPS快速搭建个人网站?
如何注册花生壳免费域名并搭建个人网站?
HTML 中动态设置元素 name 属性的正确语法详解
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
如何快速上传建站程序避免常见错误?
微信小程序 scroll-view组件实现列表页实例代码
黑客如何利用漏洞与弱口令入侵网站服务器?
教你用AI润色文章,让你的文字表达更专业
Python制作简易注册登录系统
个人网站制作流程图片大全,个人网站如何注销?
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
如何在腾讯云免费申请建站?
再谈Python中的字符串与字符编码(推荐)
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
如何用IIS7快速搭建并优化网站站点?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
iOS中将个别页面强制横屏其他页面竖屏
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
Laravel怎么为数据库表字段添加索引以优化查询
新三国志曹操传主线渭水交兵攻略
怎么用AI帮你设计一套个性化的手机App图标?
如何用PHP快速搭建高效网站?分步指南
如何在阿里云ECS服务器部署织梦CMS网站?
如何在云主机上快速搭建网站?
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
Laravel storage目录权限问题_Laravel文件写入权限设置
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
JS经典正则表达式笔试题汇总
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何用好域名打造高点击率的自主建站?
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
JavaScript如何实现类型判断_typeof和instanceof有什么区别
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
中山网站推广排名,中山信息港登录入口?
如何解决hover在ie6中的兼容性问题
Laravel怎么清理缓存_Laravel optimize clear命令详解
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】

