Удаление динамического массива, объявленного через нотацию массива arr[x][y]
#include <iostream>
using namespace std;
int main() {
int cities;
cin >> cities;
int mas[cities][cities];
for (int i = 0; i < cities; ++i) {
for (int j = 0; j < cities; ++j) {
mas[i][j] = 0;
}
}
for (int i = 0; i < cities; ++i) {
delete[] mas[i]; // ERROR: Cannot delete expression of type 'int[cities]'
}
delete[] mas; // ERROR: Cannot delete expression of type 'int[cities][cities]'
return 0;
}
Поскольку cities не известна на этапе компиляции, то компилятор в строке int mas[cities][cities]; создает (автоматически) динамический массив, верно? Или что он создает? Почему я его не могу удалить в конце программы с помощью delete[]?
mas получает тип int(*)[cities], а mas[0] получает тип int *. То есть - компилятор создает СТАТИЧЕСКИЙ массив! Но как? Ведь размер не вычисляется на этапе компиляции.
Ответы (1 шт):
Ваш массив статический. Компилятор у вас поступает нестандартно, потому что в стандарте такие фокусы не описаны и потому непереносимы.
А реализуется это очень просто — выделением нужного куска памяти в стеке.
Для того, чтобы работало ваше удаление, массив нужно создавать иначе:
int ** mas = new int*[cities];
for (int i = 0; i < cities; ++i) mas[i] = new int[cities];