Правильно ли удалить [] бесплатно в этом коде? - PullRequest
3 голосов
/ 08 января 2020

Рассмотрим следующий способ работы с динамически размещаемым двумерным массивом (по какой-то причине этот способ не отображается среди ответов здесь ):

const int nRows = 2, nCols = 3;
int (*arr)[nCols] = (int(*)[nCols])(new int[nRows * nCols]);
arr[1][1] = 2;
std::cout << arr[1][1] << endl;
delete[] arr;

Имеет delete[] в последней строке правильно освободить память в этом случае?

1 Ответ

7 голосов
/ 08 января 2020

Это неопределенное поведение; тип аргумента delete должен иметь тот же тип, что и результат соответствующего new.

. Код можно улучшить с помощью:

int (*arr)[nCols] = new int[nRows][nCols];

(или даже auto *arr = ...) в этом случае то же самое выражение удаления будет правильным. Необходимость использовать актерский состав, как правило, признак того, что вы сделали неверный шаг.

...