Есть ли переменная, выделенная в куче? - PullRequest
17 голосов
/ 16 мая 2019

У меня была викторина по теме распределения памяти, и этот вопрос натолкнул меня на смущение, так как я не удовлетворен ответами.( Вопрос )

Как я узнал, мы можем создать " Object " в куче, создав переменную-указатель , указывающую напамять, которую мы выделили в куче (используя ключевое слово new).

Для конкретного примера:

double* a = new double(-1.0f); 

Переменная a является указателем и создается на Стек указывает на память в куче.Так что, на самом деле, говорить, что a выделено в куче, неправильно.Правильно ли мое понимание?

Ответы [ 2 ]

17 голосов
/ 16 мая 2019

a - указатель с длительностью автоматического хранения .

Это указывает на double, который имеет длительность динамического хранения .

Ваша задача - позвонить delete a; до того, как потеряет указатель на динамическую память; обычно, когда a выпадает из области видимости.

(Неформально говоря, говоря о типичных реализациях C ++, вы можете сказать, что a находится в стеке и указывает на память в куче.)

4 голосов
/ 16 мая 2019

Вы, кажется, поняли.В куче есть поплавок * и указатель на стек *.Разногласие - это «просто» соглашение об именах того, как вы относитесь к поплавку.

Некоторые люди говорят о вещах, на которые указывают, в терминах «вещь, которая указывает»,Я склонен согласиться с вами: это может привести к путанице и усложнить ситуацию.

Однако в интересах справедливости: имейте в виду, что разные люди мотивируют свое использование языка.Если вы никогда не хотите иметь дело с указателями, и они являются просто способом сохранения переменной за пределами ее области видимости, тогда видение (* a) переменной и запоминание того, что она подчиняется немного другим правилам, не совсем бесполезно.

[*] По модулю грамматика / стандарты назим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...