新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++ : 深拷贝、浅拷贝与移动语义(std::move / std::forward)

发布时间:2026/9/2 6:00:12来源:尧图网络
C++ : 深拷贝、浅拷贝与移动语义(std::move / std::forward)
C++ 深拷贝、浅拷贝与移动语义(std::move / std::forward)详解这个专题回答的是C++里最核心的一个工程问题:当一个对象被拷贝、赋值、传递时,它内部持有的资源(尤其是堆内存)到底应该怎么处理?从最初粗暴的"浅拷贝"到手写"深拷贝",再到C++11引入"移动语义"从根本上避免不必要的深拷贝开销,这是一条完整的演进脉络,也是面试中的高频重灾区。目录引子:一个拷贝引发的崩溃浅拷贝(Shallow Copy)深拷贝(Deep Copy)Rule of Three(三法则)移动语义登场:为什么深拷贝还不够好Rule of Five(五法则)std::move 详解std::forward 详解std::move vs std::forward补充:拷贝消除与RVO/NRVORule of Zero(零法则,补充)常见坑汇总高频面试题一、引子:一个拷贝引发的崩溃classBuffer{public:Buffer(size_t size):size_(size),data_(newint[size]){}~Buffer(){delete[]data_;}private:size_t size_;int*data_;};Bufferb1(100);Buffer b2=b1;// 发生了什么?如果Buffer类没有自定义拷贝构造函数,编译器会自动生成一个——但它做的是逐成员拷贝(memberwise copy),对于data_这个指针成员,拷贝的只是指针本身的值(即那个地址),而不是它指向的那块内存内容。结果就是b1.data_和b2.data_指向同一块堆内存。当b1和b2都离开作用域时,各自的析构函数都会对同一块内存调用delete[]——同一块内存被释放了两次,这是一个典型的未定义行为,轻则崩溃,重则悄悄破坏程序其他部分的内存,排查成本极高。这就是"浅拷贝"问题的经典引子,也是本专题所有内容要解决的核心矛盾。二、浅拷贝(Shallow Copy)定义逐字节/逐成员地复制对象的内存内容,如果成员中包含指针,只拷贝指针的值(地址),不拷贝指针指向的实际数据。浅拷贝示意图: b1 b2 (浅拷贝之后) ┌──────────┐ ┌──────────┐ │ size_=100 │ │ size_=100 │ │ data_ ────┼──┐ ┌──┼─ data_ │ └──────────┘ │ │ └──────────┘ ▼ ▼ ┌─────────────────┐ │ 同一块堆内存 │ ← b1和b2都指向这里,谁先析构就先释放, │ (100个int) │ 另一个的data_变成悬空指针 └─────────────────┘什么时候浅拷贝是"安全"的如果类的所有成员都是基本类型(int、double、bool等)或者不涉及独立资源所有权的对象(比如成员本身就是一个值语义、自己管理好了拷贝行为的对象),编译器默认生成的浅拷贝(逐成员拷贝)是完全没问题的,不需要额外处理。只有当类里包含"裸指针指向动态分配的资源"这种情况时,浅拷贝才会变成一个真正的问题——因为拷贝出的多个对象会"误以为"自己独立拥有这份资源,但实际上是共享的,谁先释放、谁后释放,就会引发前面讲的重复释放/悬空指针问题。三、深拷贝(Deep Copy)定义不仅拷贝指针本身,还为新对象重新分配一块独立的内存,把原始数据完整复制过去,让两个对象的资源完全独立、互不影响。classBuffer{public:Buffer(size_t size):size_(size),data_(newint[size]){}// 自定义拷贝构造函数,实现深拷贝Buffer(constBufferother):size_(other.size_),data_(newint[other.size_]){std::copy(other.data_,other.data_+size_,data_)
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ESP32模组手工焊接全攻略:从工具准备到拖焊实战与问题排查 2026/9/2 7:33:25

ESP32模组手工焊接全攻略:从工具准备到拖焊实战与问题排查

在物联网和嵌入式开发领域,ESP32以其强大的Wi-Fi/蓝牙功能和极高的性价比,成为了众多创客和工程师的首选。然而,对于许多初次接触硬件开发的爱好者来说,如何将这颗小巧的芯片模组稳定、可靠地焊接到自己的电路板上,往往…

阅读更多 →
Android IjkPlayer播放RTSP/RTMP流媒体实战指南 2026/9/2 7:33:25

Android IjkPlayer播放RTSP/RTMP流媒体实战指南

简介:Android IjkPlayer 播放RTSP/RTMP视频流 Demo 是一份可运行的 Android 示例工程,面向需要处理实时流媒体播放的移动端开发者,针对系统默认 MediaPlayer 对 RTSP/RTMP 支持有限的问题,提供了基于 Bilibili 开源 IjkPlayer 的完…

阅读更多 →
QGIS几何工具实战:质心、提取、简化与泰森多边形空间分析 2026/9/2 7:33:25

QGIS几何工具实战:质心、提取、简化与泰森多边形空间分析

如果你是一名GIS(地理信息系统)开发者或数据分析师,是否曾遇到过这样的困境:手头有一堆空间数据,比如城市里的所有公园、河流或建筑轮廓,你需要快速找到它们的中心点、提取特定区域的数据、简化复杂的边界&…

阅读更多 →
gerrit权限配置模板 2026/9/2 7:33:25

gerrit权限配置模板

Rights Inherit From All-Projects Reference: refs/* Read,配置谁可见这个项目,默认要阻止注册用户可见和匿名用户Create Reference,配置谁只可在gerrit网页端创建分支Delete Reference,配置谁只可在gerrit网页端删除分支Push&am…

阅读更多 →
Python全栈实战:学生成绩管理系统毕业设计完整开发指南 2026/9/2 7:33:25

Python全栈实战:学生成绩管理系统毕业设计完整开发指南

简介:本资源是一套完整的Python毕业设计级学生成绩管理系统,面向计算机专业本科生及课程设计学习者,解决高校教务中学生、教师、课程、选课与成绩等多维度信息的结构化管理问题。系统采用前后端分离架构,含161个SVG图标文件&#…

阅读更多 →
免Root提取Android应用数据包资源:原理、工具与实战指南 2026/9/2 7:30:25

免Root提取Android应用数据包资源:原理、工具与实战指南

简介:本资源是面向安卓应用安全研究与个人数据管理学习者的免Root微信A16版本数据提取工具包,专为无系统高级权限环境设计,解决普通用户在不越狱、不解锁Bootloader前提下备份聊天记录、缓存图片及配置信息等核心数据的实操难题。压缩包共155…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞