【教科书有误】delete 和 delete[] 之间的真正区别

常见的说法认为delete和delete[]的区别在于内存释放方式,但实际上是错误的。真相是它们在释放内存时并无明显差异,都会根据指针找到内存块并释放。然而,关键区别在于析构函数的调用:delete仅调用第一个元素的析构函数,而delete[]会调用所有元素的析构函数。因此,对于包含指针成员的对象数组,应使用delete[]以避免内存问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们曾经不止一次的在很多地方甚至教课书上看到过以下关于delete和delete[]的说法(主要看红字部分。。回想一下大学老师是不是这么教你的。。。。):


此图片来源:http://www.cnblogs.com/bizhu/archive/2012/09/09/2677830.html

然而。。现实是很残酷的。。。我可以很肯定的告诉你,以上的说法是完全错误的!只能说我们被教科书坑了好多年。。。。。


在上文中曾提到过,当动态申请内存的时候,系统会记录分配的内存首地址和整块内存大小。此信息保存在CrtMemBlockHeader中,具体可以参考VC目录下CRT\SRC\DBGDEL.cpp。当我们释放内存的时候,系统会根据你给出的内存首地址(指针)来找到当时分配的内存大小,并释放这块区域。


也就是说

int* p = new int[10];

delete p; 完全等价于 delete[]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值