使用new[]分配的数组元素删除问题:逐个delete为何报错?
关于动态数组逐个delete元素触发错误的疑问
我理解指针递增后无法删除数组,因为会丢失需清理的字节数信息,但无法理解为何逐个delete动态数组的元素也不行。
以下代码在clang 12.0中触发了无效指针错误:
int main() { int n = 5; int *p = new int[n]; for(int i=0;i<n;++i){ delete &p[i]; } }
请问有人能解释原因吗?
原因解释
- C++标准严格要求内存分配与释放的配对:用
new[]分配的数组内存,必须用delete[]来释放,不能用单个delete逐个释放元素。 new[]在分配数组时,会在元素内存的前方额外存储元数据(比如数组元素数量),这些数据是给delete[]专用的,用来准确销毁所有元素并释放整块内存。- 单个
delete是为释放new创建的单个对象设计的,它无法识别new[]分配的元数据。当你调用delete &p[i]时,程序会错误地把数组中单个元素的地址当成new分配的单个对象地址去处理,这直接违反了内存管理规则,触发堆内存损坏,也就是你看到的无效指针错误。 - 即便没有立刻崩溃,这种操作也会导致内存泄漏——
new[]分配的整块内存(包括元数据部分)无法被正确释放,同时重复或错误的内存释放会破坏堆结构,引发后续不可预测的程序行为。
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

