使用delete []删除new []创建的数组

时间:2016-11-29 11:39:58

标签: c++

考虑以下代码:

#include <iostream>
#include <limits>
using namespace std;


struct my{
  int a;
  ~my(){
    cout << "d\n";
  }
};
int main(){
  my* a = new my[100];
  // cout << (void*)a << " " << (void*)&(a[0]) << endl;
  delete a; // I know I should use delete [], 
            // but just to find out what would happen if I do this.
}

程序正在打印d,然后出现分段错误。 delete的实现假定已经分配了大小为sizeof(type)的区域,并且必须释放大量内存。而delete []首先读取已分配的元素数。我发现大多数实现都将这个数字n存储在已分配内存的开头。 delete []从头开始获取n,然后继续释放已分配内存的n * sizeof(type)个字节。我不明白为什么上面的程序会给出段错误。我尝试打印地址a&(a[0])并且它们完全相同,因此delete试图清除存储n的区域的任何可能性都不正确。有人可以告诉你发生了什么事吗?

注意:当我们分配基本类型的数组时,例如intdouble等,就不会发生这种情况。

2 个答案:

答案 0 :(得分:2)

delete获取的指针使用new[]的行为是 undefined 。 (当您编写delete)时,某些C ++运行时库的实现方式使得普通旧数据类型的数组正确delete

真的没有别的可说。

答案 1 :(得分:1)

new分配的内容必须由delete释放,new[]必须由delete[]释放。

  • 不要将new用于分配,而将其他API与Windows GlobalFree()混合使用。

正确删除a:

delete[] a;
  • 如果您在动态数组中致电delete,则会产生undefined behaviour