我查看了其他一些线程,但似乎无法弄清楚如何删除 2D 数组。
以下是我初始化数组的方式。 num_items
和capacity
是预先确定的变量:
int **P = new int *[num_items];
for (x = 0; x <= num_items; x++)
P[x] = new int[capacity];
以下是我认为应该删除它的方式,但是,它正在崩溃:
for(x = 0; x <= num_items; x++)
delete [] P[x];
delete [] P;
为了澄清,我希望数组 P 能够容纳 1 个额外的num_items。因此,如果 num_items = 7,那么我希望数组大小为 8,以便 P[7] 有效。
您的评论"不需要向num_items添加 +1"和您对 for 循环的实现相互矛盾。
请记住,数组是从 0 开始的,因此 P 的有效索引为 0,但不包括 num_items。但是,在 for 循环中,x 采用值 0 到 num_items(包括 0)。
因此,修复可能是
for (x = 0; x < num_items; x++)
/* whatever */
话虽如此,您可以使用std::vector
实例吗?然后,您不必担心这种内存管理。
你的问题是你的数学:
int **P = new int *[num_items];
for (x = 0; x <= num_items; x++) // PROBLEM!
P[x] = new int[capacity];
C/C++ 中的数组是从 0 开始的,所以当你声明它的大小X
时,你可以访问从 0 到 X-1
的所有元素。 小于或等于比较将尝试访问元素X
,这是超出您声明的范围的内存,因此您将获得未定义的行为。 你想要的是:
int **P = new int *[num_items];
for (x = 0; x < num_items; x++)
P[x] = new int[capacity];
然后
for(x = 0; x < num_items; x++)
delete [] P[x];
delete [] P;
也就是说,使用std::vector
将是更好的解决方案。