从C-Style-Array中释放内存

时间:2016-08-28 07:12:50

标签: c++ arrays pointers

我写了一个简短的代码来了解原始指针创建的C风格数组。我知道今天使用这种方法很不寻常,但我只想尝试一下。所以这是我的代码:

#include <iostream>

int main() {
   int *ptr = new int[5];
   for(unsigned int counter = 0; counter < 5; counter++) {
      ptr[counter] = counter * counter;
      std::cout << ptr[counter] << std::endl;
   }

   delete [] ptr;

   std::cout << ptr[2] << std::endl; // Contains still a value
}

输出:

0
1
4
9
16
4

这是一个非常简单的代码,我刚刚创建了一个包含五个“int”字符的内存字段,并用一些数字填充它们。我在使用之后删除了数组指针构造以避免内存泄漏,但令我惊讶的是包含第三个到fith位置仍然值,第一个和第二个指针被正确删除。有没有人对这种现象有答案?

1 个答案:

答案 0 :(得分:4)

语句delete [] ptr完成后,几乎所有ptr的使用(除了重新指定某事物)都会给出未定义的行为。

C ++标准中&#34; undefined&#34;的含义是标准没有对发生的事情指定任何约束或要求。因此,使用一个实现(编译器和库),它可能会给出您看到的结果。与另一个它可以异常终止程序。对于另一种实现,每次运行程序时观察到的行为可能不同。所有这些可能性和其他可能性都是正确的,因为标准没有描述任何要求。

在您的特定情况下,它只是意味着您的实现提供的operator delete []的工作不会覆盖内存,并且不会阻止您的程序随后访问该内存。但是,您可能(或可能不会)发现一系列其他操作(例如,分配另一个阵列)可能会突然改变您看到的结果。