c++怎么实现数组的深拷贝_c++ memcpy与循环赋值【详解】-C++

深拷贝数组必须手动分配新内存并逐元素复制;原生数组不支持深拷贝语义,直接赋值会编译错误;new+循环赋值安全通用,malloc+memcpy仅适用于pod类型;memcpy不调用构造/析构函数,误用于非pod类型(如std::string)将导致悬空指针。

深拷贝数组必须自己分配新内存

在 C++ 中,原生数组(如 int arr[10])本身不支持“深拷贝”语义——它没有拷贝构造函数或赋值运算符。所谓“深拷贝数组”,本质是:申请一块**独立的新内存**,再把原数组内容逐字节或逐元素复制过去。如果你直接写 arr2 = arr1(对原生数组),编译器会报错;如果用指针或动态数组,不手动 new + copy,就只是浅拷贝(两个指针指向同一块内存)。

常见错误现象:delete[] ptr1 后再访问 ptr2,触发野指针崩溃;或修改 ptr2[i] 却意外改了 ptr1[i]。

  • 使用 new + 循环赋值:安全、可读、支持类类型(调用构造/析构)
  • 使用 malloc + memcpy:仅适用于 POD 类型(如 int、double、纯 C 结构体),不调用构造/析构函数
  • 避免 std::array 或 std::vector 时还手写拷贝——它们默认就是深拷贝

memcpy 只适合 POD 类型的按字节拷贝

memcpy 是 C 标准库函数,行为是“从 src 地址开始,连续复制 n 字节到 dst”。它不管数据类型,也不调用任何构造函数或析构函数。这意味着:只要源和目标内存布局一致、且对象不含指针/虚表/非平凡成员,memcpy 才等价于深拷贝。

典型误用:memcpy(dst, src, sizeof(std::string)) —— std::string 内部有指针,memcpy 只复制了指针值,造成双重释放或悬空引用。

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

  • ✅ 安全:复制 int*、double[100]、struct { int x; float y; }*
  • ❌ 危险:复制含 std::string、std::vector、虚函数、自定义构造函数的类对象
  • 参数顺序固定:memcpy(dst, src, n),别把 src 和 dst 写反,也别忽略 n 是字节数(不是元素个数)

循环赋值更通用,但要注意构造语义

对动态分配的数组(如 T* src = new T[n]),用循环做深拷贝是最直观的方式:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » c++怎么实现数组的深拷贝_c++ memcpy与循环赋值【详解】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3994797+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3994797+
  • 本周更新: 0+
  • 最后更新: 2026-03-16