В чем разница между этим: -простой вопрос динамического распределения
width = new int;
А это: -
int width;
т.е. того, что использование динамического распределения в первом коде?
В чем разница между этим: -простой вопрос динамического распределения
width = new int;
А это: -
int width;
т.е. того, что использование динамического распределения в первом коде?
Прежние выделяет динамически один int
и возвращает его адрес в памяти (который записывается в переменную width
и вы должны освободить его позже с delete
. Она не существует до сих пор.
Последнее объявляет локальную переменную тип int
, который становится недействительным, когда он покидает текущую область.
один выделяется на кучу, а другой на стек, один из которых вам нужно управлять, а другой - «автоматический», один из которых вы получаете через де-ссылку другой вы не ...
EDIT: по отношению к вашему второму вопросу не так много ... есть несколько случаев, но тогда вы почти всегда будете использовать умный указатель, если нет, вы играете с огнем ... :)
Что ты имел в виду, вероятно:
int* w1 = new int;
int w2;
Первый выделяется в куче, и вы должны заботиться о thememory с оператором delete
.
Второе находится в стеке и перестает существовать после того, как оно выходит из сферы действия (так что вам не нужно заботиться о себе).
Первый выделяет пространство для целого числа в куче и выделяет пространство для удержания указателя на стеке. Он также инициализирует ширину до 0. Пространство, выделенное на куче, должно быть выделено программистом (дополнительная нагрузка). Доступ к этому пространству в куче можно получить из любого места, пока указатель на него доступен, а память не освобождается.
Вторая декларация просто выделяет пространство в стеке и автоматически освобождается, когда переменная выходит за пределы области видимости. Значение ширины - мусор.
Это очень редко, что динамическое распределение int
было бы «полезным», хотя я бы не сказал «никогда».
Динамическое распределение полезно для больших сложных структур данных, чье время жизни и/или размер неизвестно во время компиляции, или просто слишком большие, чтобы положить на стек.
Возможно, вы захотите изменить «width = new int;» to "int * width = new int;" :) – Palmik 2010-11-29 21:02:53
Вам, вероятно, стоит присесть с книгой C++ для начинающих, поскольку вам явно не хватает оснований указателей. – Falmarri 2010-11-29 21:15:16