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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:04:19