Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Для чего использовать оператор new


Автор: n199a 28.5.2013, 18:43
Искал информацию про оператор new про который не так уж и много расписано. 

Если размер строки матрицы известен, а неизвестно только количество строк, можно поступить так: ввести новый тип данных – строка матрицы. Когда количество строк станет известно, с помощью оператора new выделяем массив таких данных.
Есть код:
Код

typedef int row[7]
main()
{
int N;
row *A;
printf("Введите число строк: ");
scanf("%d", &N);
A = new row[N];

delete A;
}


Описание:
Код

typedef int row[7]

Новое имя типа переменной (int) будет row.
Массив "row" типа "int", который содержит 7 элементов.
Код

row *A;

Создается указатель "А" с типом int.
Код

A = new row[N];

Оператор "new"
Указатель "А" равняется массиву с типом "row" (int) с размером массива в 7 элементов.

К этой задаче:
У нас есть массив из ? строк и строка содержит 7 элементов (т.е. длина строки равна 7 элементов).
Т.е. A[?][7]
Становится известно, что у нас 3 строки.
Получается, что, мы создаем НОВЫЙ двумерный массив, например Mass[3][7], вместо того чтобы занести в массив A кол-во строк?

Оператор new используется для сокращения кода и времени его написания? smile 
Для чего использовать оператор new?

Автор: Dem_max 28.5.2013, 18:49
Цитата

Для чего использовать оператор new?

Чтобы выделить память под "объект" и уничтожить эту память если она не нужна, а обычные объекты создаются на стеке.

Автор: n199a 28.5.2013, 18:56
Цитата(Dem_max @  28.5.2013,  18:49 Найти цитируемый пост)
Чтобы выделить память под "объект" и уничтожить эту память если она не нужна, так как обычные объекты создаются на стеке. 

Так, на сколько я понял, вся разница лишь в "месте".
new - для выделения объема для данных в памяти (куча) (ключевое слово - память).
a = 5 - помещает размер байтов в стек(ключевое слово - стек).
Следовательно, разница лишь в скорости получения этих данных из стека и кучи соответственно?
По другому - если создается большой проект, то в целях оптимизации скорости выполнения надо использовать данные из кучи, так?
Из кучи данные быстрее получают, чем из стека.
В стеке хранятся локальные переменные. Тогда глобальные в куче?

При работе со стеком он заполняется, если работу закончили - освободился. Т.е. он как бы расширяется (до определенных размеров) или сужается?
Про память. Допусти память - это объем (бочка), фиксированный размер. В бочку можно поставить кружку (определенный объем памяти) границы которой уже не смогут сужаться/расширяться.
Я правильно понял?  smile 

Автор: Dem_max 28.5.2013, 19:01
Если у тебя очень много данных то конечно выделять в куче

Автор: feodorv 28.5.2013, 19:12
Цитата(n199a @  28.5.2013,  19:56 Найти цитируемый пост)
По другому - если создается большой проект, то в целях оптимизации скорости выполнения надо использовать данные из кучи, так?

Оптимизация здесь второе дело.

Данные "на стеке" существуют только в области видимости, данные "на куче" существуют, пока выделенную под них память явно не освободят:
Код

  {
    ...
    T t; // вызов конструктора, данные "на стеке"
    ...
          // вызов деструктора, данные разрушаются
  }

  {
    T *t = new T; // данные "на куче"
    ...
    return t; // данные не разрушаются
  }

Автор: n199a 28.5.2013, 19:44
Цитата(feodorv @  28.5.2013,  19:12 Найти цитируемый пост)
Данные "на стеке" существуют только в области видимости

В смысле только для данной программы?
А если данные в куче, то и другие программы могут "видеть" эти данные?

P.S. Про разрушаемость данных уже понятно.

Автор: Alexeis 28.5.2013, 20:31
Цитата(feodorv @  28.5.2013,  20:12 Найти цитируемый пост)
Данные "на стеке" существуют только в области видимости, данные "на куче" существуют, пока выделенную под них память явно не освободят:

  Я бы сказал еще более обще. Данные в стеке уничтожаются в порядке обратном их созданию, а данные в куче уничтожаются в произвольном порядке. А уничтожаются при выходе из области видимости блока все локальные переменные созданные в блоке. Область видимости относиться именно к блоку, а не к стеку. Стек имеет лишь косвенную связь областью видимости, потому что локальные переменные создаются в стеке. Кстати, время жизни локальной переменной может быть продлено даже по выходу из блока, если на нее существует константная ссылка. Очевидно, что такие переменные хотя и создаются в стеке, но уже не будут локальными в смысле фактического размещения. А уничтожаться такая переменная все равно будет в порядке обратном ее фактического создания ввиду того, что создали ее в стеке.

Добавлено через 8 минут и 20 секунд
Цитата(n199a @  28.5.2013,  20:44 Найти цитируемый пост)
А если данные в куче, то и другие программы могут "видеть" эти данные?

  С++ ничего не знает про "другие программы". Есть адресное пространство. Программа может попытаться прочитать и записать данные по любым адресам. Если вдруг там окажутся данные чужой программы, то тогда да. У обычных программ под 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
Цитата(rodnover @  31.5.2013,  06:06 Найти цитируемый пост)
А самое главное, что стек не резиновый и в нем массив на 2 Гб не так-то просто (и самое главное не нужно) выделить.

  Резиновый или нет зависит от настроек компилятора и возможностей ОС. Под виндой резиновый. Если выделить большой массив в стеке, в одной из функций, в которых программа пребывает длительное время, то ничего страшного не будет. Но вообще да, большой массив предполагает длительное время жизни. Длительное время жизни чаще всего обеспечивает куча, поскольку освобождение памяти можно осуществлять в произвольное время.  Ассоциировать стек с малым временем жизни это инерция мышления. Стек это лишь способ управления порядком создания и удаления данных. Время жизни определяет логика программы. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)