Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
#1

Указатели (Выделение памяти в куче) - C++

06.01.2013, 22:27. Просмотров 1430. Ответов 17
Метки нет (Все метки)

Чтобы создать в динамически распределяемой памяти переменную типа unsigned short необходимо написать следующее:

unsigned short int*pPointer
Ppointer=new unsigned short int

Свойства динамической памяти выложил на скринах.


А когда создаётся следующий указатель БЕЗ слова new, в каком типе памяти создаётся этот указатель?
int*pAge=0
Миниатюры
Указатели (Выделение памяти в куче)   Указатели (Выделение памяти в куче)  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2013, 22:27     Указатели (Выделение памяти в куче)
Посмотрите здесь:
Потоки и выделение памяти в куче C++
Динамическое выделение памяти. Ошибки в куче C++
C++ Выделение памяти в куче для строки для реализации длинной арифметики
C++ указатели и выделение памяти массивам
C++ Указатели и динамическое выделение памяти
C++ Указатели С++. Динамическое выделение памяти
C++ Указатели и функции. Динамическое выделение памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
06.01.2013, 22:35     Указатели (Выделение памяти в куче) #2
С new мы выделяем память в кучу, на которою указывает этот указатель. А без new указатель инициализируется на стеке.
Croessmah
Модератор
Эксперт CЭксперт С++
13053 / 7316 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
07.01.2013, 10:46     Указатели (Выделение памяти в куче) #3
Цитата Сообщение от koderman Посмотреть сообщение
в каком типе памяти создаётся этот указатель?
В обоих случаях на стеке функции, в которой он объявлен.
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 11:28  [ТС]     Указатели (Выделение памяти в куче) #4
Значит разницы межу первым и вторым вариантами нету?
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 11:44     Указатели (Выделение памяти в куче) #5
koderman, разница может быть в том, на какие данные он указывает.

В первом случае с помощью new выделена память под переменную unsigned short int в куче, и ее адрес присвоен указателю. Сам по себе указатель не в куче, а стековая переменная, просто содержащая чей-то адрес.

Во втором случае просто создан нулевой указатель. Пока он ни на что не указывает, т.е. чей адрес он будет содержать, пока неопределено. Вы сможете присвоить ему адрес какой-нибудь стековой переменной:
C++
1
2
int x;
pAge = x;
Или также выделить память в куче:
C++
1
pAge = new int;
Или присвоить адрес, уже хранящийся в каком-то другом указателе
C++
1
pAge = oldPtr;
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:33  [ТС]     Указатели (Выделение памяти в куче) #6
Не верю.
Первый вариант создаётся в Динамически Распределяемой Памяти это точно. Поэтому и надо после резервирования памяти (new) потом эту память удалять словом delete.
А вот второй вариант наверное в стеке создаётся и стирается сам из памяти как только указатель выходит за пределы видимости программы.
(Я не о присвоении нуля говорил, а вообще об указателях такого вида, без слова new.)
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.01.2013, 12:39     Указатели (Выделение памяти в куче) #7
Цитата Сообщение от koderman Посмотреть сообщение
Не верю.

Не по теме:

ваше право


в приведенном вами коде
Цитата Сообщение от koderman Посмотреть сообщение
unsigned short int*pPointer
Ppointer=new unsigned short int
Цитата Сообщение от koderman Посмотреть сообщение
int*pAge=0
все указатели создаются на стеке
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:47  [ТС]     Указатели (Выделение памяти в куче) #8
Я читаю это в книге. В переводе такие слова перепутать нельзя. На скринах тоже это написано.
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
07.01.2013, 12:48     Указатели (Выделение памяти в куче) #9
Указатели - на стеке.
Миниатюры
Указатели (Выделение памяти в куче)  
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.01.2013, 12:52     Указатели (Выделение памяти в куче) #10
Цитата Сообщение от koderman Посмотреть сообщение
Я читаю это в книге. В переводе такие слова перепутать нельзя. На скринах тоже это написано.
можно и в книге фигу увидить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo()
{
    int* ptr = new int(100500);
}
 
int main()
{
    foo();
/* 
функция foo отработала, указатель ptr утрачен так как он создан на стеке! 
но в динамической памяти все ещё существует занятые нами 4 байта
в которые записано значение 100500
*/
}
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:58  [ТС]     Указатели (Выделение памяти в куче) #11
Ага. Тогда наверное так: Первый вариант создаётся И на стеке и в динамически распределяемой памяти, а второй вариант тот что БЕЗ слова new создаётся только на стеке?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.01.2013, 13:00     Указатели (Выделение памяти в куче) #12
Цитата Сообщение от koderman Посмотреть сообщение
C++
1
2
unsigned short int*pPointer 
Ppointer=new unsigned short int
Цитата Сообщение от koderman Посмотреть сообщение
Ага. Тогда наверное так: Первый вариант создаётся И на стеке и в динамически распределяемой памяти, а второй вариант тот что БЕЗ слова new создаётся только на стеке?
именно так, только небольшое уточнение
в динамической памяти создается объект(переменная типа unsigned short int), а затем уже на стеке создается переменная которая сожержит адрес этого объекта
Croessmah
07.01.2013, 13:25
  #13

Не по теме:

Цитата Сообщение от koderman Посмотреть сообщение
Не верю.
Тогда смысл спрашивать что-либо?

koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 13:51  [ТС]     Указатели (Выделение памяти в куче) #14
Ну вот опять недопонимание. В конце концов ведь выяснилось совсем другое.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 14:47     Указатели (Выделение памяти в куче)
Еще ссылки по теме:
C++ Указатели на строки. Выделение и освобождение памяти
C++ Указатели, выделение памяти для матрицы
Указатели, динамическое выделение памяти, работа с файлом C++
Принцип работы кода: указатели, выделение памяти C++
Указатели, связной список (Linked List) и динамическое выделение памяти C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 14:47     Указатели (Выделение памяти в куче) #15
koderman, просто поймите, что указатель сам по себе это отдельная переменная, которая хранит адрес другой переменной. При этом располагаться они могут в разных видах памяти.

C++
1
2
int x;
int * ptr = &x;
Указатель ptr - стековая переменная и содержит адрес стековой переменной x.

C++
1
int * ptr = new int;
Сам указатель опять же, создан на стеке, но содержит адрес объекта, созданного в динамически распределяемой памяти.
Yandex
Объявления
07.01.2013, 14:47     Указатели (Выделение памяти в куче)
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru