初始化和删除二维数组



我查看了其他一些线程,但似乎无法弄清楚如何删除 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] 有效。

您的评论"不需要向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将是更好的解决方案。

相关内容

  • 没有找到相关文章

最新更新