std::vector是封装动态数组行为的容器类,非裸指针动态数组;其内存由类自动管理,而new[]需手动delete[],否则易致内存泄漏、崩溃或未定义行为。

std::vector 不是“C++ 里的动态数组”,它是封装了动态数组行为的容器类;而所谓“动态数组”通常指用 new[] 手动分配的 int* 或 double* 这类裸指针 —— 二者根本不在同一抽象层级上。
std::vector 和 new[] 分配的动态数组内存管理方式不同
前者由类自动管理生命周期:构造时申请、析构时释放、拷贝/移动时正确处理资源;后者完全依赖程序员手动调用 delete[],漏掉或重复调用都会导致未定义行为。
常见错误现象包括:
- 忘记
delete[] ptr→ 内存泄漏 - 对同一指针调两次
delete[]→ 程序崩溃 - 用
delete代替delete[]→ 未定义行为(尤其对象类型) -
std::vector被复制后,两个对象各自持有独立内存,互不影响
std::vector 支持随机访问但自带容量控制逻辑
虽然底层也是连续内存,但它暴露的是 size() 和 capacity() 两个概念。你调用 push_back() 时,实际可能不触发内存分配(只要 size() );而裸指针数组没有容量概念,每次扩容都得自己 <code>new[] + memcpy + delete[]。
性能影响明显:
- 频繁
push_back()但没预分配 → 多次 realloc,O(n²) 拷贝开销 - 用
reserve(n)预留空间 → 后续 n 次push_back()都不会重新分配 - 裸指针数组想做到等效效果,得自己维护
size、capacity、data三元组,代码量和出错概率直线上升
std::vector 的迭代器失效规则比裸指针更严格也更可预测
插入/删除操作是否使迭代器失效,取决于操作位置和容器状态:
-
push_back()在size() == capacity()时会 realloc → 所有迭代器失效 -
erase(it)仅使被删元素及之后的迭代器失效(因为后续元素前移) - 裸指针数组做类似操作时,迭代器(即指针)是否失效完全取决于你有没有重分配内存 —— 没有统一规则,全靠人脑推演
-
std::vector::at()带边界检查,越界抛std::out_of_range;裸指针下标访问ptr[i]是纯 UB,调试器都不一定拦得住
真正容易被忽略的是:很多人把 std::vector 当成“带自动内存管理的数组”来用,却没意识到它在拷贝、传递、异常安全上的契约远比裸指针严密 —— 比如函数参数传 std::vector 值参,内部是移动语义优先;而传裸指针,连所有权归属都说不清。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











