Выделение памяти для объекта указателя - PullRequest
0 голосов
/ 16 сентября 2011

Как выделяется память для объекта-указателя

 char *str = "Check";
 char *str1 = new char[6];

Здесь я хочу знать, как str указывает на «Проверка» без выделения памяти (используя new).при печати str я получаю «чек».Может ли кто-то помочь мне разницу обоих.. * * 1004

Ответы [ 4 ]

4 голосов
/ 16 сентября 2011

Во-первых, «указатель» и «объект» - это разные термины в C / C ++.«указатель» - это объект, который содержит адрес «объекта» (тип данных).

В данном примере кода str указывает на область памяти, которая статически выделяется во время компиляции кода;также "Check" будет оставаться там до завершения программы.

Эта память имеет фиксированный размер и находится в области только для чтения кода.Также эта нотация устарела в C ++.Должно быть,

const char *str = "Check";  // "Check" is not modifiable
^^^^^ 
4 голосов
/ 16 сентября 2011

str указывает на память, выделенную компилятором, как правило, только для чтения.

Компилятор выдаст Check\0 в секцию только для чтения исполняемого файла и затем организует, чтобы присвоениеstr делает str указанием на это местоположение.

0 голосов
/ 16 сентября 2011

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

Компилятор, фактически, сохраняет литералы в части исполняемого файла, смещение которой становится известным компоновщику, который передает эти смещения "функции запуска".Когда программа «запускается», ОС загружает файл в память, добавляет все смещения к адресу загрузки, таким образом, преобразуя все смещения в адреса, создает «стек», чем вызывает функцию запуска.Функция запуска создает кучу, вызывает все конструкторы глобальных и статических объектов и вызывает main.На данный момент "Check" - это просто последовательность байтов, начинающаяся с данного адреса.Этот адрес присваивается str.

Следовательно, память не "выделяется компилятором".Он выделяется на этапе запуска программы и инициализируется данными, ранее сохраненными компилятором.

0 голосов
/ 16 сентября 2011

Память для так называемых «автоматических» переменных не выделяется из кучи (откуда new получает свою память).На практике такие локальные переменные обычно находятся в стеке.Во многих случаях они также могут быть непосредственно в регистрах ЦП.

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