Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с new 
V
    Опции темы
yngwie19
Дата 5.9.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Привет, помогите разобраться, правильно ли Я понимаю назначение оператора new.

1) Ппример:
Код

int main()
{

int *p; // создали указатель на какой-то объект типа int, расположенный  в стеке.
           // после выхода из области видисости указатель уничтожается.

   return 0;
}


2) Пример:
Код

int main()
{
   int *p   создали указатель на какой-то объект типа int, расположенный  в стеке/
   
   p = new int; // динамически выделили в куче(не в стеке) память для указателя p
   return 0;
}

Если это все так, то объясните пожалуйста различия между int *p и int p = new int кроме различного выделения памяти в стеке и в куче.


Это сообщение отредактировал(а) yngwie19 - 5.9.2008, 15:16
PM MAIL   Вверх
Fin
Дата 5.9.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: нет
Всего: 10



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

При завершении функции, место, которое было выделено для указателя будет возрашено обратно в стек. И если ты не перелал значение указателя в другую переменную, то значение указателя будет утеряно. И соответственно произойдет течь памяти.  

В первом случае, у тебя просто выделяется память на сам указатель. Но нету выделения памяти для хранения данных. 
Во втором случае, у тебя будет выделена еше и память. Но при выходе из main у тебя повиснет выделенная память, хотя ОС и подчистит все течи памяти. 
На это   int p = new int; компилятор должен отругаться. Так как не соответствует уровень. 
int *p; -  просто обьявляеш, что есть указатель.
int *p = new int; -  обьявляеш что есть указатель и выделяеш память в куче. И передаеш адрес начала выделенного блока в указатель.

Это сообщение отредактировал(а) Fin - 5.9.2008, 16:11


--------------------
Пролетал мимо.
PM MAIL   Вверх
yngwie19
Дата 5.9.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



fin спасибо за разъяснение, а в чем тогда разница:
Код

int main()
{

   int a;
   int *p = a;

   return 0;
}


И

Код

int main()
{
   int *p;
   p = new int;
    return 0;
}

PM MAIL   Вверх
Lazin
Дата 5.9.2008, 16:31 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



 smile 

PM MAIL Skype GTalk   Вверх
Annihilator
Дата 5.9.2008, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



В первом примере ты пишешь
Код

 int *p = a;

что в переводе на русский означает: "загузит по адресу p значtние переменной а".
Но что за адрес в p? Ты не выделил под него память!!! Так нельзя.
Вот так надо

Код

int main()
{
   int a = 12;
   int *p;
   p = new int;
   *p = a; 
   return 0;
}



--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
UnrealMan
Дата 5.9.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(yngwie19 @  5.9.2008,  17:21 Найти цитируемый пост)
fin спасибо за разъяснение, а в чем тогда разница

Например, в том, что первый код не скомпилится.

Цитата(Annihilator @  5.9.2008,  20:17 Найти цитируемый пост)
что в переводе на русский означает: "загузит по адресу p значtние переменной а".

Жжёшь.

Цитата(Annihilator @  5.9.2008,  20:17 Найти цитируемый пост)
Но что за адрес в p? Ты не выделил под него память!!!

p как раз обозначает область памяти (которую компилятор должен выделить сам), куда будет помещён адрес.
PM MAIL   Вверх
yngwie19
Дата 5.9.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(Annihilator @ 5.9.2008,  19:17)
Но что за адрес в p? Ты не выделил под него память!!! Так нельзя.



а что тогда делает int *p ?, разве это не говорит о том, что в адресе p будет храниться переменная размером в 4 байта?
PM MAIL   Вверх
UnrealMan
Дата 5.9.2008, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(yngwie19 @  5.9.2008,  22:32 Найти цитируемый пост)
а что тогда делает int *p ?, разве это не говорит о том, что в адресе p будет храниться переменная размером в 4 байта?

Если исправить твой пример на

Код
int main()
{
   int a;
   int *p = &a;
}

то в переменной p будет храниться адрес локальной переменной a. Объект a прекратит своё существование по завершении выполнения функции main, в то время как объект, созданный в динамической памяти при помощи new-expression, существует до тех пор, пока для указателя на этот объект не выполнят соответствующее delete-expression.

Это сообщение отредактировал(а) UnrealMan - 5.9.2008, 21:41
PM MAIL   Вверх
Acer
Дата 5.9.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



Мне кажется, вы сбиваете человека с толка... называйте хотябы все своими именами...
Код

int *p;

это не переменная p. А указатель на область памяти типа int.
Код

int a;

это переменная, которая содержит значение типа int
Код

p = &a;

это значит, что p указывает на ту область памяти, где хранится значение a.
PM MAIL   Вверх
yngwie19
Дата 6.9.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



объясните в чем тогда смысл этой записи, например:

Код

int main()
{

int *p;

p = new int[10];

return 0;
}


Объявили указатель p, выделили область памяти, на который этот указатель ссылается массив из 10 int.

Вопрос 1:

Почему, если мы выделии массив из 10 int, то мы все равно можем присвоить 11, 12, 13 итд элементу массива какое-нибудь значение, и нормально с ним работать. 

Вопрос 2:

вместо 
Код

int *p;
p = new int[10];

можем сделать так? (Будет ли это одно и тоже?)
Код

int array[10];

int *p = array



PM MAIL   Вверх
vinter
Дата 6.9.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(Acer @  6.9.2008,  00:03 Найти цитируемый пост)
это не переменная p

указатель это тоже переменная.

Цитата(yngwie19 @  6.9.2008,  11:39 Найти цитируемый пост)
Почему, если мы выделии массив из 10 int, то мы все равно можем присвоить 11, 12, 13 итд элементу массива какое-нибудь значение, и нормально с ним работать. 

это ненормально, и 99%, что программа от этого упадет. Ты лезешь в "не свой" участок памяти.

Цитата(yngwie19 @  6.9.2008,  11:39 Найти цитируемый пост)
можем сделать так? 

можем

Цитата(yngwie19 @  6.9.2008,  11:39 Найти цитируемый пост)
Будет ли это одно и тоже?)

в первом случае это указатель, указывающий на участок памяти в куче размером 10 интов.
во втором случае это массив из 10 интов, располагающийся в стеке


--------------------
Мой блог
PM MAIL WWW   Вверх
W4FhLF
Дата 6.9.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Цитата(yngwie19 @  6.9.2008,  10:39 Найти цитируемый пост)
Почему, если мы выделии массив из 10 int, то мы все равно можем присвоить 11, 12, 13 итд элементу массива какое-нибудь значение, и нормально с ним работать. 


Ты обращаешься к памяти, которая тебе не принадлежит. То, что тебе это сходит с рук -- простое везение. Ты просто затираешь память, которая выделена для чего-то другого. К чему это в конечном счёте приведёт сказать сложно, скорее всего приложение просто рухнет, если практиковать подобную ересь.

Цитата(yngwie19 @  6.9.2008,  10:39 Найти цитируемый пост)
можем сделать так? (Будет ли это одно и тоже?)


Тогда так:

Код

int *p = &array


В обоих случаях p указывает на массив из 10 целых чисел. Но в первом случае они размещены в динамической памяти, которую тебе будет необходимо освободить, а во втором случае массив размещается в стеке, он будет уничтожен при выходе из области видимости(обычно это метод или функция). 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Lazin
Дата 6.9.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



в общем, нужно взять учебник и почитать, особенно внимательно почитать тему про арифметику указателей
PM MAIL Skype GTalk   Вверх
W4FhLF
Дата 6.9.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



опоздал smile


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
UnrealMan
Дата 6.9.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(Acer @ 6.9.2008,  00:03)
Мне кажется, вы сбиваете человека с толка... называйте хотябы все своими именами...
Код

int *p;

это не переменная p. А указатель на область памяти типа int.

Область памяти, над которой можно выполнять определённый рамками языка набор операций, именуется объектом. Переменная - это обозначение объекта в исходном коде программы при помощи некоторого имени. Указатель - это разновидность объекта, он предназначен для хранения адреса другого объекта, либо адреса функции. В частности, указатель на int предназначен для хранения адреса объекта типа int.

Цитата(W4FhLF @ 6.9.2008,  11:49)
Тогда так:

Код

int *p = &array

Зачем тут операция взятия адреса?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0714 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.