You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中delete与delete[]的区别 数组内存释放应使用哪个?

C++ 动态数组内存释放问题解答

结论优先

你通过int* arr = new int[n];的方式分配动态数组时,释放内存必须使用delete[] arr;,使用delete arr;属于C++标准明确规定的未定义行为,即使部分编译环境下运行没有明显报错,也属于错误写法,存在极大隐患。


delete 和 delete[] 的核心差异

  • 配对规则不同:C++中动态内存分配和释放必须配对使用:单对象分配new对应单对象释放delete,数组分配new[]对应数组释放delete[],混用就会触发未定义行为。
  • 析构处理逻辑不同:
    普通delete只会处理指针指向的单个对象,调用1次析构函数后回收对应内存。
    delete[]会先读取new[]额外存储的数组长度信息,遍历数组依次调用每一个元素的析构函数,再回收整块数组内存。
  • 平凡类型兼容误区说明:你示例中使用的int是没有自定义析构函数的平凡类型,部分编译器可能对这类场景做了兼容,混用delete暂时不会出现明显异常,但这只是编译器的兼容实现,不代表写法合法。一旦你用new[]分配自定义类的对象数组,混用delete会直接导致:仅第一个对象的析构函数被调用,剩下N-1个对象的资源无法释放,出现内存泄漏,严重时会直接触发程序崩溃。
  • 内存布局处理不同:new[]分配数组时,实际会多分配一小段内存存储数组元素个数,返回给你的指针是跳过长度存储区之后的地址。delete[]会自动回退到长度存储区读取元素数量,再走完整的释放流程;而普通delete会直接把你拿到的指针当做单对象内存的起始地址释放,直接导致内存释放地址错误,引发各种不可预期的问题。

内容的提问来源于stack exchange,提问作者Abdulwahab Almestekawy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:54:01