Есть ли переменная, выделенная в куче?
У меня был тест на тему распределения памяти, и этот вопрос натолкнул меня на смущение, так как я не удовлетворен ответами. (вопрос)
Как я узнал, мы можем создать " Объект " в Heap, создав переменную-указатель, указывающую на память, выделенную для нас в Heap (используя new
ключевое слово).
Для конкретного примера:
double* a = new double(-1.0f);
Переменная a
является указателем и создается в точке стека для памяти в куче. Так на самом деле, говоря выделяется в куче не так. a
Мое понимание верно?
Ответы
Ответ 1
a
- указатель с автоматической продолжительностью хранения.
Это указывает на double
который имеет динамическую продолжительность хранения.
Это ваша работа, чтобы позвонить delete a;
прежде чем потерять указатель на динамическую память; как правило, когда выпадает из сферы. a
(Неформально говоря, говоря о типичных реализациях C++, вы можете сказать, что a
находится в стеке и указывает на память в куче.)
Ответ 2
Вы, кажется, поняли. В куче есть поплавок * и указатель на стек *. Разногласия "просто" соглашение об именах для того, как вы относитесь к float.
Некоторые люди говорят о вещах, на которые указывают, с точки зрения того, что делает указание. Я склонен согласиться с вами: это может привести к путанице и может добавить сложности.
Однако в интересах справедливости: имейте в виду, что разные люди по-разному мотивируют использование языка. Если вы никогда не хотите иметь дело с указателями, и они являются просто способом сохранения переменной за пределами ее области видимости, тогда видение (* a) переменной и запоминание того, что она подчиняется немного другим правилам, не совсем бесполезно.
[*] По модулю грамматика/стандарты назим.