<p>malloc分配数组必须手动计算字节数,如int数组用malloc(10 * sizeof(int));必须检查返回指针是否为nullptr;只能用free释放,不可混用delete;仅适用于POD类型,非平凡类型应使用vector等现代C++方案。</p>

malloc 分配数组时必须手动计算字节数
malloc 不知道你要存什么类型,只认字节数。直接写 malloc(10) 得到的是 10 字节内存,不是 10 个 int —— 这是最常踩的坑。
- 对
int数组:用malloc(10 * sizeof(int)),不能省略sizeof - 对
double数组:用malloc(n * sizeof(double)),n是元素个数 - 别用
malloc(10 * sizeof(*ptr))试图“推导”——此时ptr还没赋值,*ptr未定义,编译可能过,但行为未定义
分配后必须检查返回指针是否为 nullptr
malloc 失败时不抛异常,只返回 nullptr。C++ 里不检查就直接解引用,程序大概率崩溃。
- 写法示例:
int* arr = static_cast<int*>(malloc(100 * sizeof(int))); if (arr == nullptr) { // 处理分配失败,比如 return 或 throw std::bad_alloc{} } - 别用
if (!arr)虽然等价,但显式写== nullptr更清晰、更符合 C++ 风格 - 注意:C++ 中推荐用
new或容器,但若必须用 malloc(如对接 C API),这步绝不能跳
malloc 分配的内存不能用 delete 释放
混用分配/释放方式是未定义行为,轻则内存泄漏,重则程序当场 crash。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- malloc / calloc / realloc → 必须配
free -
new→ 必须配delete;new[]→ 必须配delete[] - 错误示例:
int* p = static_cast<int>(malloc(10 * sizeof(int))); delete p;</int>—— 这是危险操作 - 尤其注意:某些旧代码里看到
delete释放 malloc 内存,可能是历史包袱,但绝不该在新代码中复制
malloc 不调用构造函数,不适合含非平凡构造函数的类型
比如你 malloc 一块内存来放 std::string 数组,那些 string 对象根本没被构造——它们的内部指针是随机值,后续任何操作都 UB。
立即学习“C++免费学习笔记(深入)”;
- 能安全用 malloc 的类型:POD 类型(如
int、double、纯 struct) - 不能用的:含构造函数、析构函数、虚函数、非静态成员的类(哪怕只是
std::string或std::vector) - 替代方案:用
std::vector、std::unique_ptr<t></t>,或用operator new+ placement new(极少数需要精细控制时才考虑)
实际项目里,除非要和 C 库交互或做底层内存池,否则几乎没理由用 malloc。它绕过了 C++ 的类型系统和资源管理契约,出错时调试成本远高于写几行 std::vector。真要用,记住四件事:算清字节、判空、只用 free、避开非 POD 类型。

















