运行时错误:2D动态数组问题

4
我有如下代码:
int **arr = new int*[5];

for(int i = 0; i < 5; ++i)
    arr[i] = new int[];

for(int i = 0; i < 5; ++i)
    delete [] arr[i];

delete [] arr;

现在它已经成功编译和运行,但是如果我从第一行中删除数组大小“5”,代码就会编译,但在最后一行崩溃。我有以下问题,但在Straustrup的C++书籍,互联网等方面均未找到答案。
  1. 为什么代码在指定情况下会崩溃?(我猜测是delete []无法找到要删除的数组大小而导致崩溃。)
  2. 如果不允许分配多维数组而不指示大小,为什么编译器在编译时没有捕获此类错误?

这个线程应该会有所帮助。https://dev59.com/aXNA5IYBdhLWcg3wHp-B - Mahesh
这在GCC 4.6.1上甚至都无法编译。 - Kerrek SB
1个回答

3

使用[5],您将获得一个包含5个int*的数组。

如果去掉[5],则意味着您要得到一个指向int的指针。因此,您实际上有new int*[1]

然后您使用从0到4的数字对其进行索引,这是越界了。


你的意思是 int*[] 等同于 int*[1] 吗? 如果是这样,那么代码应该在第二次迭代的第一个“for”循环内崩溃,但实际上它在最后一行崩溃了。 - Arik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接