C ++删除堆上的数组

时间:2018-10-20 21:31:01

标签: c++ arrays memory new-operator delete-operator

我很难找到有关如何正确执行此操作的答案。

我想更好地理解删除堆上分配的新内存的不同方法,尤其是在二维数组的情况下。

以我的示例为例: 我在由int指针(int * d [5])组成的堆栈上有一个大小为5的数组。 我在循环中初始化每个int指针,以创建并指向堆上大小为8的int数组(d [i] = new int [8])。 现在,我基本上已经创建了一个二维数组(d [j] [k])。

我的问题是仅删除堆上单个数组(int [8])的语法是什么?

我目前是这样的,但是在调试时,似乎在执行之后并没有释放数组...

for(int i = 0; i <5; ++ i)      删除d [i];

是“删除[] d [i]”还是仅仅是“删除[] d”或其他变体?另外,有没有办法删除int [8]数组的各个元素?如果有人可以简明地解释语法及其区别,那将非常有帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

如果通过d[i] = new int[8]分配了数组,则必须通过delete[] d[i]删除它们。在不重新分配整个对象的情况下,无法重新分配此类数组的各个元素。

答案 1 :(得分:0)

您提到要在循环内分配内部数组。我相信它看起来像这样。

int*d[2];
for (int i = 0; i < 2; i++)
{
    d[i] = new int[3];
}

请注意,d[2]仅包含指向数组的指针。 因此,要删除此数组,您必须遍历每组数组指针 然后调用delete [] d [i];

for (int i = 0; i < 2; i++)
{
        delete[] d[i];
}

作为附加说明,知道您的IDE如何尝试检测内存损坏将非常有帮助。

例如在Visual Studio中(在调试模式下)

  • 0xCD表示通过malloc或new分配的内存,但从未写入 该应用程序。
  • 0xCC表示未初始化的变量。
  • 0XDD表示内存已通过删除或释放释放。
  • 0xFD表示隔离存储,并充当保护程序。用于检测超出范围的索引数组。

牢记这一点,让我们看看执行上述代码时是否可以理解IDE的功能。

将d数组声明为int*d[2];时,内存布局如下所示; enter image description here 请注意,d数组有两个元素,但是没有一个具有初始值,因此它们被分配给0xCC

让我们看看d[i] = new int[3];之后会发生什么 enter image description here 注意,d数组现在有两个元素,每个元素包含一个int数组。您看到的值是指向我们为其分配内存的数组的指针的地址。

因为我们知道地址是什么,所以我们可以查看内存并查看在分配和删除每个数组时其中发生了什么。

例如,在for循环内分配了第二个int数组后,内存位置将如下所示;
enter image description here 请注意,所有数组元素都具有0xCD,其结尾为0xFD。这将在我的IDE中指示已分配的内存并在其周围设置了防护栏。

让我们看看删除d[2]时会发生什么。 enter image description here