Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Для чего использовать оператор new |
Автор: n199a 28.5.2013, 18:43 | ||||||||
Искал информацию про оператор new про который не так уж и много расписано. Если размер строки матрицы известен, а неизвестно только количество строк, можно поступить так: ввести новый тип данных – строка матрицы. Когда количество строк станет известно, с помощью оператора new выделяем массив таких данных. Есть код:
Описание:
Новое имя типа переменной (int) будет row. Массив "row" типа "int", который содержит 7 элементов.
Создается указатель "А" с типом int.
Оператор "new" Указатель "А" равняется массиву с типом "row" (int) с размером массива в 7 элементов. К этой задаче: У нас есть массив из ? строк и строка содержит 7 элементов (т.е. длина строки равна 7 элементов). Т.е. A[?][7] Становится известно, что у нас 3 строки. Получается, что, мы создаем НОВЫЙ двумерный массив, например Mass[3][7], вместо того чтобы занести в массив A кол-во строк? Оператор new используется для сокращения кода и времени его написания? ![]() Для чего использовать оператор new? |
Автор: Dem_max 28.5.2013, 18:49 | ||
Чтобы выделить память под "объект" и уничтожить эту память если она не нужна, а обычные объекты создаются на стеке. |
Автор: Dem_max 28.5.2013, 19:01 |
Если у тебя очень много данных то конечно выделять в куче |
Автор: feodorv 28.5.2013, 19:12 | ||||
Оптимизация здесь второе дело. Данные "на стеке" существуют только в области видимости, данные "на куче" существуют, пока выделенную под них память явно не освободят:
|
Автор: n199a 28.5.2013, 19:44 |
В смысле только для данной программы? А если данные в куче, то и другие программы могут "видеть" эти данные? P.S. Про разрушаемость данных уже понятно. |
Автор: Alexeis 28.5.2013, 20:31 | ||||
Я бы сказал еще более обще. Данные в стеке уничтожаются в порядке обратном их созданию, а данные в куче уничтожаются в произвольном порядке. А уничтожаются при выходе из области видимости блока все локальные переменные созданные в блоке. Область видимости относиться именно к блоку, а не к стеку. Стек имеет лишь косвенную связь областью видимости, потому что локальные переменные создаются в стеке. Кстати, время жизни локальной переменной может быть продлено даже по выходу из блока, если на нее существует константная ссылка. Очевидно, что такие переменные хотя и создаются в стеке, но уже не будут локальными в смысле фактического размещения. А уничтожаться такая переменная все равно будет в порядке обратном ее фактического создания ввиду того, что создали ее в стеке. Добавлено через 8 минут и 20 секунд
С++ ничего не знает про "другие программы". Есть адресное пространство. Программа может попытаться прочитать и записать данные по любым адресам. Если вдруг там окажутся данные чужой программы, то тогда да. У обычных программ под Windows или Linux в адресном пространстве нет данных чужих программ. У драйверов есть. |
Автор: rodnover 31.5.2013, 05:06 |
А самое главное, что стек не резиновый и в нем массив на 2 Гб не так-то просто (и самое главное не нужно) выделить. И на сколько я помню быстрее-то, как раз стековые переменные. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51a4d1036ccc191540000002#findElement_E7045_51a805b86ccc197007001518_0 |
Автор: Alexeis 31.5.2013, 11:18 | ||
Резиновый или нет зависит от настроек компилятора и возможностей ОС. Под виндой резиновый. Если выделить большой массив в стеке, в одной из функций, в которых программа пребывает длительное время, то ничего страшного не будет. Но вообще да, большой массив предполагает длительное время жизни. Длительное время жизни чаще всего обеспечивает куча, поскольку освобождение памяти можно осуществлять в произвольное время. Ассоциировать стек с малым временем жизни это инерция мышления. Стек это лишь способ управления порядком создания и удаления данных. Время жизни определяет логика программы. |