std::vector扩容本质是重新分配内存、复制/移动元素、释放旧内存三步操作;因内存连续性要求及对象生命周期管理,无法原地扩容,realloc也不适用于含构造函数的类型。

new[] 分配的数组不能直接扩容
动态数组一旦用 new[] 分配,内存块大小就固定了,C++ 没有类似 realloc 的内置机制。强行“扩容”只会导致未定义行为——比如写越界、覆盖相邻内存、程序崩溃。你看到的某些“伪扩容”操作(如 memcpy 到新地址后 delete 原指针),本质是重新分配 + 复制 + 释放,不是真正意义上的原地扩容。
手动扩容三步必须严格按顺序执行
如果坚持不用 std::vector,手动实现扩容需同时处理三件事,缺一不可:
- 用
new[]分配更大容量的新内存(比如翻倍:new int[new_capacity]) - 用
std::copy或memcpy把旧数据搬过去(注意:对象类型必须可位拷贝,否则用std::copy) -
先复制完数据,再
delete[]旧指针;顺序颠倒会导致悬空指针或重复释放
示例片段:
int* arr = new int[old_size]; // ... 使用 arr int* new_arr = new int[new_size]; std::copy(arr, arr + old_size, new_arr); // 安全搬运 delete[] arr; // 必须在 copy 之后 arr = new_arr; // 更新指针
realloc 不适用于 C++ 对象数组
即使你尝试用 C 标准库的 realloc,它只适合 POD 类型(如 int、char)。对含构造/析构函数的类类型(如 std::string 数组),realloc 会绕过构造函数调用,导致对象状态损坏、资源泄漏。编译器不会报错,但运行时行为不可预测。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
常见错误现象:realloc 后访问对象成员崩溃、析构函数没被调用、字符串内容乱码。
为什么 vector 是更安全的选择
std::vector 内部就是按上述三步自动完成扩容,但它额外做了几件关键事:
- 记录当前
size()和capacity(),避免重复判断 - 对非 POD 类型,用 placement new 和显式析构保证对象生命周期正确
- 异常安全:若新内存分配失败,原数据保持有效(强异常保证)
除非你在写底层容器、嵌入式受限环境,或明确需要裸指针控制,否则直接用 std::vector —— 它的 push_back 和 reserve 就是标准扩容接口。
真正容易被忽略的是:手动管理时,每次扩容后都要同步更新“逻辑长度”和“物理容量”两个变量;漏掉任何一个,后续的 size 判断或循环边界就会出错。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










