使用delete释放内存时出现运行时错误是什么原因
问题原因
运行时错误由new/delete配对规则违反导致,属于典型的C++堆内存操作未定义行为:
- 构造函数中通过
new int[3]申请的是连续数组类型的堆内存,按照C++标准要求,这类内存必须使用数组专用的释放操作符delete[]回收 - 当前析构函数使用的是普通
delete操作符,仅能回收单个非数组对象的堆内存,用它释放数组内存会破坏堆管理器的内部结构,直接触发运行时崩溃。
修复方案
只需要将析构函数中的delete i修改为delete[] i即可,修正后完整代码如下:
#include <stdio.h> struct A { int* i; A() { i = new int[3]; } ~A() { delete[] i; } }; int main() { A t; }
规则说明
C++内存管理的配对要求是严格的,不存在兼容混用的情况:
- 单个对象分配:
new 类型必须配对delete 指针 - 数组对象分配:
new 类型[长度]必须配对delete[] 指针 - 二者混用会触发未定义行为,可能表现为崩溃、内存泄漏、随机数据损坏,不存在“偶尔能跑就没问题”的情况。
内容的提问来源于stack exchange,提问作者cb_ann
相关产品推荐
相关产品推荐

