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

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

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

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

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

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

unsigned short int*pPointer
Ppointer=new unsigned short int

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


А когда создаётся следующий указатель БЕЗ слова new, в каком типе памяти создаётся этот указатель?
int*pAge=0
0
Миниатюры
Указатели (Выделение памяти в куче)   Указатели (Выделение памяти в куче)  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2013, 22:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели (Выделение памяти в куче) (C++):

Потоки и выделение памяти в куче - C++
Подскажите, кто знает, какие есть тонкости при выделении памяти в куче (new) в потоках отличных от главного. У меня возникают исключения...

Динамическое выделение памяти. Ошибки в куче - C++
Функция чтения данных из ячейки экселя wchar_t *DataInCell( Excel::_WorksheetPtr Sheet, int Row, int Col ) Excel::RangePtr Cell; ...

Выделение памяти в куче для строки для реализации длинной арифметики - C++
Доброго времени суток, пишу класс string, на основе которого потом хочу реализовать класс для длинной арифметики. Поэтому мне понадобился...

указатели и выделение памяти массивам - C++
дана действительная матрица размером m x n. Определить числа b1, b2, b3.... bn равные соответственно значениям средних арифметических...

Указатели С++. Динамическое выделение памяти - C++
Не пойму, почему перед квадратными скобками нужна звездочка? int **memoryAddr = new int *; Звездочка при работе с указателями несет смысл...

Указатели и динамическое выделение памяти - C++
Нужно заполнить массив из 200 элементов числами на промежутке , и найти последовательность из 10 элементов у которых наибольшее срееднее...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
06.01.2013, 22:35 #2
С new мы выделяем память в кучу, на которою указывает этот указатель. А без new указатель инициализируется на стеке.
0
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 842
Регистрация: 27.09.2012
Сообщений: 18,402
Записей в блоге: 3
Завершенные тесты: 1
07.01.2013, 10:46 #3
Цитата Сообщение от koderman Посмотреть сообщение
в каком типе памяти создаётся этот указатель?
В обоих случаях на стеке функции, в которой он объявлен.
1
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 11:28  [ТС] #4
Значит разницы межу первым и вторым вариантами нету?
0
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;
1
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:33  [ТС] #6
Не верю.
Первый вариант создаётся в Динамически Распределяемой Памяти это точно. Поэтому и надо после резервирования памяти (new) потом эту память удалять словом delete.
А вот второй вариант наверное в стеке создаётся и стирается сам из памяти как только указатель выходит за пределы видимости программы.
(Я не о присвоении нуля говорил, а вообще об указателях такого вида, без слова new.)
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 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
все указатели создаются на стеке
0
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:47  [ТС] #8
Я читаю это в книге. В переводе такие слова перепутать нельзя. На скринах тоже это написано.
0
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
07.01.2013, 12:48 #9
Указатели - на стеке.
1
Миниатюры
Указатели (Выделение памяти в куче)  
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 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
*/
}
1
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:58  [ТС] #11
Ага. Тогда наверное так: Первый вариант создаётся И на стеке и в динамически распределяемой памяти, а второй вариант тот что БЕЗ слова new создаётся только на стеке?
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 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), а затем уже на стеке создается переменная которая сожержит адрес этого объекта
1
Croessmah
07.01.2013, 13:25
  #13

Не по теме:

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

0
koderman
2 / 2 / 1
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 13:51  [ТС] #14
Ну вот опять недопонимание. В конце концов ведь выяснилось совсем другое.
0
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;
Сам указатель опять же, создан на стеке, но содержит адрес объекта, созданного в динамически распределяемой памяти.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 14:47
Привет! Вот еще темы с ответами:

Указатели и функции. Динамическое выделение памяти - C++
1) Напишите программу, которая позволяет вводить динамический одно-мерный целочисленный массив и посредством вызова функции опреде-лять...

Указатели на строки. Выделение и освобождение памяти - C++
Всем добрый день. Есть два указателя на char. Для первого выделяется память а у второго просто делаем копию с первого. Для 1-го...

Указатели, выделение памяти для матрицы - C++
Ребята , nомогите nожалуйста , что означают эти заnиси, nросто не могу ни где найти обьяснения. Знаю что 1-е это выделяет nамять для...

Принцип работы кода: указатели, выделение памяти - C++
Объясните мне что делает этот код: p = new int ; И вот этот, пожалуйста: struct DList{ int m; DList *p};


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.01.2013, 14:47
Ответ Создать тему
Опции темы

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