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]
后会发生什么。
我很难找到关于如何具体正确执行此操作的答案。
我想更好地了解删除堆上分配的新内存的不同方法,尤其是在二维数组的实例中。
以我为例: 我在堆栈上有一个大小为 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];
内存布局如下所示;
0xCC
让我们看看d[i] = new int[3];
之后会发生什么
因为我们知道地址是什么,所以我们可以查看内存,看看在分配和删除每个数组时那里发生了什么。
例如,在 for 循环中分配第二个 int 数组后,内存位置看起来像这样;
0xCD
并以 0xFD
结尾。这将在我的 IDE 中表明已分配内存并在其周围设置了防护栏。
让我们看看删除 d[2]
后会发生什么。