Динамическое распределение памяти в C ++ требует нового оператора new? - PullRequest
0 голосов
/ 29 июля 2011
int d;
cin >> d;
int asdf[d];

Считается ли это динамическим распределением памяти? Согласно http://www.cplusplus.com/doc/tutorial/dynamic/, кажется, что я даже не смогу скомпилировать это, потому что массивы без использования оператора new могут быть объявлены только с постоянным размером, возможно, я неправильно их прочитал. (Я использую CodeBlocks с компилятором GNU CCC)

В чем разница между этим и

int d;
int *asdf;
cin >> d;
asdf = new int[d];

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

Ответы [ 2 ]

9 голосов
/ 29 июля 2011

int x[n]; - это массив переменной длины (VLA), который имеет автоматическую продолжительность хранения (т. Е. "В стеке").Это недопустимо в C89 или C ++ 98/03, но оно было введено в C99 и обычно доступно как расширение, например, в GCC.

Функциональность также может быть имитирована на некоторых платформах с не-стандартная alloca() функция, которая использовалась до того, как VLA стали распространенными.

1 голос
/ 29 июля 2011

Память, выделенная первым методом, берется из стека, выделенного для приложения.Когда вы используете new, память выделяется из кучи, куча может предоставить достаточно памяти, чем вы можете получить из стека.Но чтобы использовать new, ваша переменная должна быть указателем того же типа, что и ваш массив.Переменная-указатель содержит адрес первой ячейки памяти.int * a = new int [x];будет содержать х ячеек памяти и будет освобожден, если вы специально удалите указатель, пока программа еще работает.

...