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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:26:03