0

0

C++中std::unique_ptr可以存储在std::vector中吗? (移动语义容器)

穿越時空

穿越時空

发布时间:2026-02-25 14:36:13

|

114人浏览过

|

来源于php中文网

原创

能,但必须用 std::move;因 unique_ptr 禁止拷贝,push_back 默认尝试拷贝会编译失败,移动后原指针为空,对象存于堆、vector 仅存指针,缓存不友好。

c++中std::unique_ptr可以存储在std::vector中吗? (移动语义容器)

std::unique_ptr 能不能直接 push_back 到 vector 里?

能,但必须用 std::move,否则编译失败。因为 std::unique_ptr 禁止拷贝,而 vector::push_back 的默认重载会尝试拷贝元素。

常见错误现象:error: use of deleted function 'std::unique_ptr<t>::unique_ptr(const std::unique_ptr<t>&)'</t></t>

  • 正确做法:用 vec.push_back(std::move(ptr)),把所有权转移进去
  • 如果从函数返回临时 std::unique_ptr,比如 make_unique<foo>()</foo>,可直接 push_back —— 因为临时对象自动触发移动(无需显式 std::move
  • 注意:移动后原 ptr 变成空(ptr == nullptr),再访问会出错

vector<:unique_ptr>> 的内存布局和性能影响

每个 std::unique_ptr 本身只占一个指针大小(通常 8 字节),vector 存的是这些指针的连续数组,不是对象本体。

  • 对象实际分配在堆上,彼此不连续 → 缓存不友好,遍历时比 vector<t></t>
  • 但插入/删除末尾元素很快(只移动指针,不移动对象)
  • 若需频繁随机访问且关心缓存,优先考虑 vector<t></t>vector<shared_ptr>></shared_ptr>(仅当需要共享所有权)

emplace_back 和 make_unique 怎么配合用才安全?

推荐组合:vec.emplace_back(std::make_unique<t>(args...))</t>,避免中间变量和多余移动。

Cogniflow
Cogniflow

Cogniflow是一个无代码AISaas解决方案,允许用户创建和部署AI模型,

下载

立即学习C++免费学习笔记(深入)”;

  • 错误写法:vec.emplace_back(new T(args...)) —— 手动 new 容易忘 delete,且不异常安全
  • emplace_back 会直接在 vector 内部构造 unique_ptr,跳过临时对象
  • 如果 T 构造可能抛异常,make_unique 保证异常安全:要么全成功,要么不分配

为什么 vector 里存 unique_ptr 后不能用 sort 或 stable_sort?

可以,但必须传自定义比较函数,且不能直接比较 unique_ptr 本身(它只支持 ==/!=/ 等,但语义是地址比较,通常不是你想要的)。

  • 常见误用:std::sort(vec.begin(), vec.end()) → 按指针地址排序,结果不可控
  • 正确做法:按所指对象内容排序,例如 std::sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) { return *a
  • 注意:如果 *a*b 是空指针,解引用会崩溃 —— 必须先判空

最常被忽略的一点:vector<:unique_ptr>></:unique_ptr> 的析构是自动的,但如果你用 reset() 或赋值覆盖某个元素,旧对象会立刻销毁;而整个 vector 被销毁时,所有剩余非空 unique_ptr 也会自动释放 —— 这部分不用管,但得确保没提前裸指针泄露。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

404

2023.09.04

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

391

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2023.10.25

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

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

552

2023.09.20

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

423

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

596

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.12.29

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

65

2026.02.25

热门下载

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

精品课程

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

共94课时 | 10.2万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.4万人学习

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

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