最安全可靠的方式是使用 std::copy;它类型安全、可优化,但需确保源有效、目标空间足够、迭代器匹配,且不负责内存分配。

用 std::copy 复制数组最安全可靠
直接用循环赋值虽然可行,但容易越界、难维护,std::copy 是 C++ 标准库中专为这类场景设计的工具,底层可自动优化,且类型安全。
使用时注意三点:源范围必须有效、目标空间必须足够、迭代器类型要匹配。
-
std::copy要求传入的是迭代器(或指针),不是数组本身,所以得用&arr[0]或arr(数组名退化为指针) - 目标数组必须预先分配好空间,
std::copy不负责内存分配 - 对
std::array和原生数组都适用,但不能用于未初始化的目标数组(比如只声明没定义大小)
int src[5] = {1, 2, 3, 4, 5};
int dst[5];
std::copy(src, src + 5, dst); // ✅ 正确:明确长度,dst 已有空间用 memcpy 复制 POD 类型数组最快但有风险
memcpy 是 C 风格的内存拷贝,在复制纯数据(POD)类型如 int、float、char 数组时效率最高,但它不调用构造函数/析构函数,也不检查类型,误用会引发未定义行为。
- 只适用于 trivially copyable 类型;含虚函数、引用、非平凡构造函数的类不能用
memcpy - 必须手动计算字节数:
sizeof(T) * N,写错会导致截断或越界 - 源和目标内存不能重叠,重叠请改用
memmove
double a[3] = {1.1, 2.2, 3.3};
double b[3];
memcpy(b, a, sizeof(double) * 3); // ✅ 安全,因为 double 是 POD用 std::vector 替代原生数组能避免多数复制陷阱
原生数组复制麻烦的根本原因是它不带长度信息、不能移动/复制语义。换成 std::vector 后,复制变成值语义操作,简洁又安全。
立即学习“C++免费学习笔记(深入)”;
-
std::vector的拷贝构造或赋值会自动分配内存并深拷贝元素 - 支持移动语义(
std::move),避免冗余拷贝 - 如果原始数据来自 C 接口或栈数组,可用
std::vector构造函数接管:
int c_arr[4] = {10, 20, 30, 40};
std::vector<int> v(c_arr, c_arr + 4); // ✅ 从原生数组构造常见错误:把数组名当值传递导致“复制失败”
C++ 中原生数组不能直接赋值或按值传参,所谓“复制数组”的代码如果写了 dst = src;,编译直接报错:error: array type 'int [5]' is not assignable。
- 函数参数写
void f(int arr[5])实际等价于void f(int* arr),传进去只是指针,不复制内容 - 返回局部数组(如
int[5])是无效的,栈内存已销毁 - 想“传数组”又不想手动管理长度,就用
std::array或std::span(C++20)封装
真正需要复制时,别绕开边界检查和内存归属——要么用 std::copy,要么换容器。


















