Зачем нужны динамические массивы в C ++? - PullRequest
2 голосов
/ 20 мая 2011

Я не понимаю необходимости динамических массивов. Насколько я понимаю, динамические массивы необходимы, потому что не всегда можно определить, какой размер массива потребуется во время выполнения.

Но, конечно, это можно сделать?:

cin >> SIZE;
int a[SIZE];

Так в чем же дело с динамическими массивами и оператором new?

Ответы [ 6 ]

7 голосов
/ 20 мая 2011

Во-первых, это расширение компилятора, а не Standard C ++. Во-вторых, этот массив размещается в стеке, тогда как оператор new выделяет из кучи, которые являются двумя очень разными местами, что резко влияет на время жизни массива. Какая польза от этого кода, если я хочу вернуть этот массив? В-третьих, что вы собираетесь делать, если хотите изменить его размер?

1 голос
/ 20 мая 2011
cin >> SIZE; int a[SIZE];

Некоторым из моих пользователей довольно сложно пользоваться мышью, и вы хотите, чтобы они указали моему приложению, сколько памяти выделить?

1 голос
/ 20 мая 2011

SIZE - это переменная, которая означает, что ее значение можно изменить. Массив по определению не может ни расти, ни уменьшаться в своем размере. Таким образом, его размер должен быть постоянной времени компиляции.

0 голосов
/ 20 мая 2011

Лично я предпочитаю:

std::cin >> size;
std::vector a(size);

Позже, как уже упоминали другие, вы могли бы сделать что-то вроде ...

std::cin >> size;
a.resize(size);

... но, и это, вероятно,Ключевой момент, вам не нужно, если вы не хотите.Если ваши требования и ограничения таковы, что они могут быть удовлетворены статическими массивами / векторами / другими структурами данных, то это здорово.Пожалуйста, не думайте, что вы знаете достаточно о требованиях и ограничениях других, чтобы удалить из них очень полезный инструмент.

0 голосов
/ 20 мая 2011

В первые дни C в стеке было свободное место, когда вы впервые входили в функцию, а размер стека не изменялся до тех пор, пока вы не вызвали другую функцию или не вернули ее.Вот почему все переменные должны быть объявлены в верхней части функции, и почему размеры массива должны быть известны во время компиляции, чтобы компилятор мог зарезервировать известное количество стека.

В то время как C ++ ослабилограничения объявления переменных, он все еще сохранял ограничение знания требований стека во время компиляции.Я не знаю почему.

Как отмечается в ссылке в комментариях, C наконец-то разрешил использовать динамические массивы.Это произошло после того, как C и C ++ были разделены, поэтому C ++ автоматически не получил такую ​​возможность.Весьма распространено найти его поддерживаемым как расширение в C ++.

0 голосов
/ 20 мая 2011

Динамические массивы очень удобны ... предположим, что вы продолжаете генерировать объекты, и вы не представляете, сколько объектов может быть сгенерировано (т. Е. Сколько информации вы можете получить от того, кто набирает ответ в приглашении, или из сети розетка и тд)? Вам либо придется делать прогнозы относительно того, какие подходящие размеры необходимы, либо вам придется кодировать жесткие ограничения. И то, и другое является проблемой, и в случае жестких ограничений для массивов может привести к выделению слишком большого объема памяти для выполняемой работы, чтобы попытаться охватить все возможные обстоятельства, с которыми можно столкнуться. Даже в этом случае вы можете столкнуться с переполнением буфера, которое создает дыры в безопасности и / или сбои. Возможность для объекта динамически распределять новую память, сохраняя при этом связь между объектами так, чтобы у вас был постоянный доступ (а не линейный доступ, как если бы вы получали с помощью связанного списка), очень и очень удобный инструмент.

...