Насколько я понимаю, независимо от C ++, C # или Java, когда мы используем ключевое слово new
для создания объекта, оно выделяет память в куче.
Ваше понимание неверно:
new
может работать по-разному в разных языках программирования, даже если эти языки внешне похожи. Не позволяйте подобному синтаксису C #, C ++ и Java ввести вас в заблуждение!
Термины «куча» и «стек» (как они понимаются в контексте управления внутренней памятью) просто не относятся ко всем языкам программирования. Возможно, эти две концепции чаще являются деталями реализации, чем частью официальной спецификации языка программирования.
(IIRC, это верно по крайней мере для C # и C ++. Я не знаю о Java.)
Тот факт, что они являются такими широко распространенными деталями реализации, не означает, что вы должны полагаться на это различие, или что вы даже не должны знать об этом! (Тем не менее, я признаю, что мне обычно полезно знать, «как все работает» внутри.)
Я бы посоветовал вам перестать слишком беспокоиться об этих понятиях. Важная вещь, которую вы должны получить, это понять семантику языка; например, для C # или любого другого языка .NET - разница в семантике ссылочного типа и типа значения.
Пример: что спецификация C # говорит об операторе new
:
Обратите внимание, как в следующей части спецификации C #, опубликованной ECMA (4-е издание) , не упоминается ни один "стек" или "куча":
14.5.10 Новый оператор
Оператор new используется для создания новых экземпляров типов. [& Hellip;]
Оператор new подразумевает создание экземпляра типа, но не обязательно подразумевает динамическое распределение памяти. В частности, экземпляры типов значений не требуют дополнительной памяти помимо переменных, в которых они находятся, и динамическое распределение не происходит, когда new используется для создания экземпляров типов значений.
Вместо этого он говорит о «динамическом выделении памяти», но это не одно и то же: вы можете динамически распределять память в стеке, в куче или где-либо еще (например, на жестком диске). .
Что говорит , тем не менее, говорит о том, что экземпляры типов значений хранятся на месте, и это именно то, что представляет собой семантика типов значений: экземпляры типов значений копируются во время присваивания, в то время как ссылки на экземпляры типа ссылаются / "псевдоним" Это - важная вещь для понимания, а не «куча» или «стопка»!