初始化和删除二维数组

时间:2013-11-11 03:13:08

标签: c++ arrays

我看了几个其他线程,但似乎无法弄清楚如何删除2d数组。

以下是我正在初始化数组的方法。 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]有效。

2 个答案:

答案 0 :(得分: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实例吗?然后,您不必担心这种内存管理。

答案 1 :(得分:2)

你的问题是你的数学:

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将是更好的解决方案。