new创建数组必须指定大小且不支持花括号初始化,返回t*指针;必须用delete[]释放,否则未定义行为;无运行时长度信息,需手动维护;推荐优先使用std::vector替代。

new 创建数组的语法和基本用法
直接用 new 创建数组必须显式指定元素个数,且不能用初始化列表(C++11 之后也不行)。它返回指向首元素的指针,类型是 T*,不是数组类型。
-
int* arr = new int[5];—— 分配 5 个未初始化的int -
std::string* strs = new std::string[3];—— 调用 3 次默认构造函数 - 不能写成
new int[5]{1,2,3,4,5},编译报错:C++ 不支持new数组的花括号初始化
必须配对使用 delete[],否则 UB
用 new[] 分配的内存,必须用 delete[] 释放。用 delete(不带方括号)会导致未定义行为,常见表现是程序崩溃、内存泄漏或静默损坏。
- 正确:
delete[] arr; - 错误:
delete arr;—— 即使编译通过,运行时可能出问题 - 更危险的是混用:用
new int[1]后调用delete obj_ptr(obj_ptr是单个对象指针),或反过来
new[] 没法知道数组长度,别指望 runtime 获取
new[] 分配的数组在运行时没有元信息记录长度,C++ 标准不提供任何接口(比如 std::size() 或成员函数)来查询它。你必须自己保存长度。
- 错误假设:
int* p = new int[10]; size_t n = sizeof(p)/sizeof(*p);—— 这算出来永远是 1(指针大小 / 元素大小) - 正确做法:始终配套维护一个变量,例如
int* arr = new int[n];,后续只用n - 如果真需要带长度的动态数组,优先考虑
std::vector<int></int>,它内部封装了长度与自动管理
替代方案:为什么 vector 几乎总是更好
除非你在写底层库、受嵌入式约束,或明确需要裸指针语义,否则直接用 std::vector 更安全、更灵活、性能不输。
-
std::vector<int> v(5);</int>—— 等价于new int[5],但自动管理内存 -
v.size()可随时获取长度;支持push_back、迭代器、移动语义 - 异常安全:如果构造中途抛异常,
vector会自动清理;而new[]配合多个对象构造失败时,需手动处理已构造对象 - 注意:不要用
vector的data()指针长期持有——若 vector realloc,指针失效
用 new[] 和 delete[] 写错配对或漏记长度,是 C++ 中极难调试的坑。哪怕只是临时测试,也建议从第一行就用 std::vector。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











