std::vector是c++中替代裸new[]最安全的做法,它自动管理内存、支持值语义复制、异常安全且兼容移动语义,能有效避免内存泄漏、越界和深拷贝错误。

用 std::vector 代替裸 new[] 是最安全的做法
手动管理动态数组(int* arr = new int[n])时复制,极易漏掉深拷贝、内存泄漏或越界。现代 C++ 应优先用 std::vector —— 它默认支持值语义复制,且自动管理生命周期。
-
std::vector赋值(v2 = v1)或构造(std::vector<int> v2 = v1</int>)会完整复制元素,无需手动new/delete - 底层仍可能触发堆分配,但异常安全、移动语义友好,且支持
std::move(v1)避免冗余拷贝 - 若必须保留裸指针接口(如对接 C API),再考虑手动复制,否则不建议
手动复制裸动态数组:必须显式分配 + 循环赋值
如果因历史代码或特定约束必须用 int* arr1 = new int[n],复制到另一块动态内存,不能直接赋值指针(那只是浅拷贝,两个指针指向同一块内存)。
- 先用
new int[n]分配目标内存,大小必须与源一致(或按需调整) - 用
for或std::copy逐个复制元素:std::copy(arr1, arr1 + n, arr2) - 务必检查
arr1是否为nullptr,且n >= 0,否则std::copy行为未定义 - 复制后,两个数组需各自独立调用
delete[],顺序无关,但漏删必泄漏
memcpy 能用吗?仅限 POD 类型且大小严格匹配
memcpy(dst, src, n * sizeof(T)) 比循环快,但有硬性限制:
- 只适用于 trivially copyable 类型(如
int、double、纯 C struct),含虚函数、非平凡构造/析构的类不能用 -
src和dst内存不能重叠,否则要用memmove - 必须确保
n正确,且sizeof(T)与实际分配单位一致(例如new char[n]不能用sizeof(int)) - 错误示例:
memcpy(arr2, arr1, sizeof(int*))—— 这只拷了指针本身,不是数组内容
常见崩溃点:忘记 delete[] 或错用 delete
裸动态数组复制后,最常见的运行时错误不是复制逻辑本身,而是后续内存管理失控:
- 用
delete释放new[]分配的内存 → 未定义行为,多数编译器直接 crash - 复制后只删了源或只删了目标 → 内存泄漏或二次释放
- 把栈数组地址(如
int buf[10])传给delete[]→ 崩溃 - 复制时
n算错(比如用strlen处理非字符串数组)→ 越界读写,行为随机
真正麻烦的从来不是“怎么复制”,而是“复制之后谁负责、何时释放、是否还有其他指针别名”。裸数组在复杂控制流中极易失控,std::vector 的 RAII 特性几乎消除了这类问题。如果接口强制要求裸指针,至少把分配/复制/释放逻辑封装进一个 RAII 类里,别散落在多处。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











