0

0

c++中unique_ptr怎么移交所有权_c++ std::move用法【实战】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-26 12:45:11

|

151人浏览过

|

来源于php中文网

原创

std::unique_ptr不可复制只能移动,拷贝构造和赋值被删除;移交所有权需用std::move()标记为右值,此后源变为空,目标获得资源;函数传参或返回时应合理使用move,避免二次move等逻辑错误。

c++中unique_ptr怎么移交所有权_c++ std::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。真正要检查的是业务逻辑里是否误判了所有权状态。

BgSub
BgSub

免费的AI图片背景去除工具

下载

立即学习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 判断。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1497

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

230

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

87

2025.10.17

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

773

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

527

2023.09.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

176

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

98

2025.11.27

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

482

2023.08.04

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

14

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.6万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号