在C++中,调用delete运算符时会发生什么?

ozm*_*zmo 2 c++ memory arrays delete-operator

在C++中,我理解delete运算符在与数组一起使用时"销毁"它,释放它使用的内存.但是这样做会发生什么?

我想我的程序只会标记要重新使用的堆的相关部分,并继续.

但我注意到,数组的第一个元素也设置为null,而其他元素保持不变.这有什么用途?

int * nums = new int[3];
nums[0] = 1;
nums[1] = 2;

cout << "nums[0]: " << *nums << endl;
cout << "nums[1]: " << *(nums+1) << endl;

delete [] nums;

cout << "nums[0]: " << *nums << endl;
cout << "nums[1]: " << *(nums+1) << endl;
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 19

delete[]调用时会发生两件事:

  1. 如果数组的类型具有非平凡的析构函数,则会以相反的顺序为数组中的每个元素调用析构函数
  2. 释放数组占用的内存

在调用之后访问数组占用的内存会delete导致未定义的行为(也就是说,任何事情都可能发生 - 数据可能仍然存在,或者当您尝试读取它时程序可能会崩溃,或者可能发生更糟糕的事情).