Удаление динамического массива, объявленного через нотацию массива arr[x][y]

Рейтинг: 0Ответов: 1Опубликовано: 05.04.2023
#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 *. То есть - компилятор создает СТАТИЧЕСКИЙ массив! Но как? Ведь размер не вычисляется на этапе компиляции.

Ответы

▲ 3

Ваш массив статический. Компилятор у вас поступает нестандартно, потому что в стандарте такие фокусы не описаны и потому непереносимы.

А реализуется это очень просто — выделением нужного куска памяти в стеке.

Для того, чтобы работало ваше удаление, массив нужно создавать иначе:

int ** mas = new int*[cities];
for (int i = 0; i < cities; ++i) mas[i] = new int[cities];