![]() |
|
Модераторы: bsa |
![]()
|
|
| yngwie19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Привет, помогите разобраться, правильно ли Я понимаю назначение оператора new.
1) Ппример:
2) Пример:
Это сообщение отредактировал(а) yngwie19 - 5.9.2008, 15:16 |
||||
|
|||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Оператор new выделяет память в куче и возрашает указатель на выделенную память.
При завершении функции, место, которое было выделено для указателя будет возрашено обратно в стек. И если ты не перелал значение указателя в другую переменную, то значение указателя будет утеряно. И соответственно произойдет течь памяти. В первом случае, у тебя просто выделяется память на сам указатель. Но нету выделения памяти для хранения данных. Во втором случае, у тебя будет выделена еше и память. Но при выходе из main у тебя повиснет выделенная память, хотя ОС и подчистит все течи памяти. На это int p = new int; компилятор должен отругаться. Так как не соответствует уровень. int *p; - просто обьявляеш, что есть указатель. int *p = new int; - обьявляеш что есть указатель и выделяеш память в куче. И передаеш адрес начала выделенного блока в указатель. Это сообщение отредактировал(а) Fin - 5.9.2008, 16:11 -------------------- Пролетал мимо. |
|||
|
||||
| yngwie19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
fin спасибо за разъяснение, а в чем тогда разница:
И
|
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
|
|||
|
||||
| Annihilator |
|
||||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
В первом примере ты пишешь
что в переводе на русский означает: "загузит по адресу p значtние переменной а". Но что за адрес в p? Ты не выделил под него память!!! Так нельзя. Вот так надо
-------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
||||
|
|||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
||||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
а что тогда делает int *p ?, разве это не говорит о том, что в адресе p будет храниться переменная размером в 4 байта? |
|||
|
||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Если исправить твой пример на
то в переменной p будет храниться адрес локальной переменной a. Объект a прекратит своё существование по завершении выполнения функции main, в то время как объект, созданный в динамической памяти при помощи new-expression, существует до тех пор, пока для указателя на этот объект не выполнят соответствующее delete-expression. Это сообщение отредактировал(а) UnrealMan - 5.9.2008, 21:41 |
||||
|
|||||
| Acer |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: нет Всего: 8 |
Мне кажется, вы сбиваете человека с толка... называйте хотябы все своими именами...
это не переменная p. А указатель на область памяти типа int.
это переменная, которая содержит значение типа int
это значит, что p указывает на ту область памяти, где хранится значение a. |
||||||
|
|||||||
| yngwie19 |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
объясните в чем тогда смысл этой записи, например:
Объявили указатель p, выделили область памяти, на который этот указатель ссылается массив из 10 int. Вопрос 1: Почему, если мы выделии массив из 10 int, то мы все равно можем присвоить 11, 12, 13 итд элементу массива какое-нибудь значение, и нормально с ним работать. Вопрос 2: вместо
можем сделать так? (Будет ли это одно и тоже?)
|
||||||
|
|||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
указатель это тоже переменная.
это ненормально, и 99%, что программа от этого упадет. Ты лезешь в "не свой" участок памяти. можем в первом случае это указатель, указывающий на участок памяти в куче размером 10 интов. во втором случае это массив из 10 интов, располагающийся в стеке |
|||
|
||||
| W4FhLF |
|
||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
Ты обращаешься к памяти, которая тебе не принадлежит. То, что тебе это сходит с рук -- простое везение. Ты просто затираешь память, которая выделена для чего-то другого. К чему это в конечном счёте приведёт сказать сложно, скорее всего приложение просто рухнет, если практиковать подобную ересь. Тогда так:
В обоих случаях p указывает на массив из 10 целых чисел. Но в первом случае они размещены в динамической памяти, которую тебе будет необходимо освободить, а во втором случае массив размещается в стеке, он будет уничтожен при выходе из области видимости(обычно это метод или функция). -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
в общем, нужно взять учебник и почитать, особенно внимательно почитать тему про арифметику указателей
|
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
опоздал
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| UnrealMan |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Область памяти, над которой можно выполнять определённый рамками языка набор операций, именуется объектом. Переменная - это обозначение объекта в исходном коде программы при помощи некоторого имени. Указатель - это разновидность объекта, он предназначен для хранения адреса другого объекта, либо адреса функции. В частности, указатель на int предназначен для хранения адреса объекта типа int.
Зачем тут операция взятия адреса? |
||||||||
|
|||||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |