Ошибка времени выполнения на динамических массивах 2D-массивов - PullRequest
4 голосов
/ 05 сентября 2011

У меня есть следующий код:

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' из первой строки, код компилируется, но вылетает с ошибкой во время выполненияпоследняя строкаУ меня есть следующие вопросы, на которые мне не удалось найти ответы в книге Страуструпа на C ++, в Интернете и т. Д.

  1. Почему код падает в указанном случае?(Я предполагаю, что delete [] не может найти размер массива, который нужно удалить, и падает.)
  2. Если не разрешено выделять многомерные массивы без указания размера, почему такие ошибки не перехватываются компилятором при компиляциивремя?

1 Ответ

3 голосов
/ 05 сентября 2011

С [5] вы получаете массив 5 int* с.

Если вы удаляете [5], вы говорите, что хотите указатель на указатель на int.По сути, у вас есть new int*[1].

Затем вы индексируете его числами от 0 до 4, что выходит за пределы.

...