Каков наилучший способ выделения памяти для n-мерного массива в c++ во время выполнения? Я пытаюсь прочитать матрицу значений из файла, и в зависимости от того, какой файл я читаю, матрица может быть любого размера. Однако, как только матрица будет создана, ее размер будет статическим.
Поскольку во время компиляции я не знаю, какой размер будет, я не могу определить его как int[a][b]
, поэтому я экспериментировал с использованием указателей на указатели типа int**
, но когда я объявляю int** arr; arr[0][0] = 1
int** arr; arr[0][0] = 1
Я получаю сообщение об ошибке. Я также экспериментировал с другими решениями. Например, я попытался использовать один из ответов для определения размера массива в инициализаторе конструктора, используя int* arr; arr = new int[a]
int* arr; arr = new int[a]
, но он не работает, как только я попытаюсь использовать его для двух измерений. Конечно, я мог бы использовать его неправильно, но следующий блок кода дает мне segfault:
int** arr;
(*arr) = new int[a];
edit: И, конечно же, сразу после того, как я задаю этот вопрос, я нахожу что-то полуподходящее в разделе "Нужна помощь в распределении динамической памяти для двухмерных массивов в c++. Я бы предпочел не делать этого таким образом, но это определенно выполнимо.
Вы сделали бы что-то подобное (украденное из этого ответа):
int** ary = new int*[sizeX];
for(int i = 0; i < sizeX; ++i)
ary[i] = new int[sizeY];
Кроме того, вы можете сделать это:
int *ary = new int[sizeX*sizeY];
// ary[i][j] is then rewritten as
ary[i*sizeY+j]
Это может устранить головную боль указателя.
index = x * width + y
.