从C-Style-Array释放内存

Release memory from C-Style-Array

本文关键字:内存 释放 C-Style-Array      更新时间:2023-10-16

我写了一段简短的代码来了解由原始指针创建的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"字符,并填入一些数字。我在使用后删除了数组指针结构,以避免内存泄漏,但令我惊讶的是,包含第三到第五个位置仍然值,第一个和第二个指针被正确删除。有谁能解释这个现象吗?

一旦语句delete [] ptr完成,几乎任何对ptr的使用(除了将其重新赋值为指向某物)都会产生未定义的行为。

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

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