new 和 delete 必须配对使用,否则内存泄漏;动态数组需用 new[] 分配、delete[] 释放,漏方括号导致未定义行为;指针不存长度信息,越界访问无检查,须手动保存并验证下标。

new 和 delete 必须配对使用,否则内存泄漏
用指针实现动态数组,本质是手动申请和释放堆内存。C++ 中最直接的方式是 new 分配、delete[] 释放。很多人写成 delete p(漏掉方括号),会导致未定义行为——对象析构不全、内存无法回收,程序可能暂时跑得通,但长期运行或换编译器就崩。
-
new int[n]返回int*,不是int;别用int* p = new int; p[0] = 1;去“假装”是数组——这只能存 1 个元素 - 释放时必须用
delete[] p,哪怕数组里只存了 1 个元素 - 如果中途
p被赋值为其他地址(比如重新new),旧地址没delete[]就永远丢掉了
下标访问和越界检查完全靠自己负责
指针动态数组不带长度信息,p[i] 的合法性全由你保证。编译器不会插手,运行时也不报错——越界读可能拿到脏数据,越界写大概率覆盖相邻变量或元数据,引发崩溃或诡异逻辑错误。
- 务必单独保存长度,比如
int* arr = new int[n]; int len = n;;别指望从指针反推大小 - 循环写成
for (int i = 0; i ,而不是 <code>for (int i = 0; p[i] != 0; ++i)(除非你明确以 0 为哨兵且确保不会出现) - 传参时,必须同时传指针和长度,例如
void process(int* a, int size);只传int*是危险接口
用 vector 替代裸指针才是现代 C++ 的常规做法
除非你在写底层库、嵌入式受限环境,或者刻意练习内存管理,否则没必要手撸动态数组。标准 std::vector 自动管理内存、提供 size()、支持异常安全、还能 move 优化——它底层就是用 new/delete[] 实现的,但帮你挡住了所有坑。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
std::vector<int> v(n);</int>等价于new int[n],且自动初始化为 0 -
v.push_back(x)动态扩容,不用自己算倍增、new更大块、复制、delete[]旧块 - 函数参数优先用
const std::vector<int>&</int>,避免拷贝,也比裸指针 + 长度更清晰
如果真要手写,至少封装成 RAII 类
裸指针动态数组在函数间传递、异常路径、提前 return 场景下极易出错。哪怕只是临时练手,也建议包一层类,把 new/delete[] 锁进构造/析构里。
立即学习“C++免费学习笔记(深入)”;
- 构造函数用
new int[n],拷贝构造要深拷贝(别直接复制指针) - 析构函数必须
delete[] data_,且确保data_不为空(比如初始化为nullptr) - 重载
[]运算符可加断言:assert(i >= 0 && i ,调试时提前暴露问题
真正难的不是分配那几行代码,而是让生命周期清晰、异常安全、可维护——这些裸指针本身不提供任何保障。

















