讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋雪大大_8538

秋雪大大_8538

发布时间:2026-02-08 13:53:09

|

1019人浏览过

|

来源于php中文网

原创

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

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

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

在 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]),用循环做深拷贝是最直观的方式:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
for (int i = 0; i < n; ++i) {
    dst[i] = src[i]; // 调用 T 的拷贝赋值运算符
}

这行代码是否真正完成深拷贝,取决于 T 自身的实现。例如:

  • T = int:简单赋值,效果同 memcpy
  • T = std::string:调用 std::string::operator=,内部会重新分配内存,真正深拷贝字符串内容
  • T 是自定义类:需确保已正确定义拷贝赋值运算符(或依赖编译器生成的,默认行为对含指针成员仍是浅拷贝)

性能上,循环比 memcpy 稍慢(函数调用开销、可能的分支),但语义明确、类型安全、可调试。

最容易被忽略的点:析构与所有权归属

无论用 memcpy 还是循环,你手动分配了内存(new T[n]),就必须手动释放(delete[] ptr)。C++ 不会自动追踪谁拥有这块内存。

更隐蔽的问题是:如果原数组里存的是指针(如 MyClass** arr),那“深拷贝数组”到底要不要也深拷贝每个 MyClass* 指向的对象?这完全由业务逻辑决定,memcpy 和循环都只处理第一层——它们复制的是指针值,不是指针所指内容。

建议:除非有极致性能要求且确认是 POD,否则优先用 std::vector<t></t>。它的拷贝构造自动完成深拷贝,内存管理零出错风险。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3231

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

554

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

542

2026.02.12

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6919

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

7087

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

824

2025.10.23

java基础知识汇总
java基础知识汇总

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

6224

2023.10.24

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

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

3224

2024.02.23

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn