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 p2 = p1; 或者传值给函数,编译器会直接报错: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_ptr p = 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【手册】