我看了几个其他线程,但似乎无法弄清楚如何删除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]有效。
答案 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
将是更好的解决方案。