0

我查看了其他一些线程,但似乎无法弄清楚如何删除二维数组。

这是我初始化数组的方式。num_itemscapacity是预先确定的变量:

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] 有效。

4

2 回答 2

5

您的评论“不需要向 num_items 添加 +1”和您对 for 循环的实现相互矛盾。

请记住,数组是从 0 开始的,因此 P 的有效索引为 0 到但不包括 num_items。但是,在您的 for 循环中, x 取值 0 到并包括 num_items

因此,修复很可能

for (x = 0; x < num_items; x++)
    /* whatever */

说了这么多,你能用std::vector实例代替吗?然后,您不必担心这种内存管理。

于 2013-11-11T03:18:00.567 回答
2

你的问题是你的数学:

int **P = new int *[num_items];
for (x = 0; x <= num_items; x++) // PROBLEM!
     P[x] = new int[capacity];

C/C++ 中的数组是从 0 开始的,所以当你声明它有一个 sizeX时,你可以访问从 0 到X-1. 您的小于或等于比较将尝试访问 element 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将是更好的解决方案。

于 2013-11-11T03:21:43.453 回答