C++中数组调用delete操作符的行为:为何arr++后delete会崩溃
为什么两段C++代码运行结果不同?
这是个很典型的动态内存管理误区,咱们一步步拆解清楚:
示例2:运行正常的代码
char * arr = new char[10]; delete arr;
首先,new char[10]会在堆上分配一块能容纳10个char的内存,并且返回这块内存的原始起始地址,把这个地址存在arr指针里。当你调用delete arr时(这里插一句:严格来说,用new[]分配的数组应该对应delete[]来释放,不过char类型比较特殊,很多编译器对这种不匹配的情况会兼容处理),编译器能通过这个起始地址精准找到对应的内存块,正确完成释放操作,所以程序运行正常。
示例1:程序崩溃的代码
char * arr = new char[10]; arr++; delete arr;
问题就出在arr++这一步:执行这个操作后,arr指针不再指向new返回的原始起始地址,而是偏移到了数组第二个元素的位置。
内存管理系统的规则很严格:delete(或delete[])必须接收当初new(或new[])返回的那个精确地址,才能正确追踪并释放对应的内存块。用偏移后的指针调用delete属于未定义行为——程序可能直接崩溃,也可能悄悄造成内存泄漏,甚至出现其他诡异的问题,崩溃是最常见的表现。
最后再补个小提醒:哪怕是char数组,也尽量坚持new[]配delete[]的规范,养成好习惯,避免在处理其他类型数组时踩同样的坑。
内容的提问来源于stack exchange,提问作者DigviJay Patil
相关产品推荐
相关产品推荐

