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
相关产品推荐
相关产品推荐

