C++删除堆上的数组

C++ deleting array on the heap

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

我想更好地了解删除堆上分配的新内存的不同方法,尤其是在二维数组的实例中。

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

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

我目前拥有它,但在调试时显示数组在执行后未被释放...

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

应该是 "delete [] d[i]" 还是 "delete [] d" 或其他变体?另外,有没有办法删除 int[8] 数组的单个元素?如果有人能简明扼要地解释语法及其差异,那将非常有帮助。谢谢!

如果您通过 d[i] = new int[8] 分配数组,则必须通过 delete[] d[i] 删除它们。如果不取消分配整个数组,就无法取消分配此类数组的单个元素。

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

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(在 DEBUG 模式下)

  • 0xCD 表示通过 malloc 或 new 分配的内存但从未被写入 应用程序。
  • 0xCC 表示未初始化的变量。
  • 0XDD表示内存已被delete或free释放。
  • 0xFD表示fence memory,起到守卫的作用。用于检测越界的索引数组。

考虑到这一点,让我们看看在执行上述代码时我们是否可以理解 IDE 在做什么。

声明 d 数组时 int*d[2]; 内存布局如下所示; 请注意 d 数组有两个元素,但其中 none 具有初始值,因此它们被分配给 0xCC

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

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

例如,在 for 循环中分配第二个 int 数组后,内存位置看起来像这样;
请注意,所有数组元素都具有 0xCD 并以 0xFD 结尾。这将在我的 IDE 中表明已分配内存并在其周围设置了防护栏。

让我们看看删除 d[2] 后会发生什么。