Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131

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

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

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

unsigned short int*pPointer
Ppointer=new unsigned short int

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


А когда создаётся следующий указатель БЕЗ слова new, в каком типе памяти создаётся этот указатель?
int*pAge=0
Миниатюры
Указатели (Выделение памяти в куче)   Указатели (Выделение памяти в куче)  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2013, 22:27
Ответы с готовыми решениями:

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

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

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

17
погромист
 Аватар для coloc
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
06.01.2013, 22:35
С new мы выделяем память в кучу, на которою указывает этот указатель. А без new указатель инициализируется на стеке.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
07.01.2013, 10:46
Цитата Сообщение от koderman Посмотреть сообщение
в каком типе памяти создаётся этот указатель?
В обоих случаях на стеке функции, в которой он объявлен.
1
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 11:28  [ТС]
Значит разницы межу первым и вторым вариантами нету?
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
07.01.2013, 11:44
koderman, разница может быть в том, на какие данные он указывает.

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

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

Не по теме:

ваше право:D


в приведенном вами коде
Цитата Сообщение от koderman Посмотреть сообщение
unsigned short int*pPointer
Ppointer=new unsigned short int
Цитата Сообщение от koderman Посмотреть сообщение
int*pAge=0
все указатели создаются на стеке
0
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:47  [ТС]
Я читаю это в книге. В переводе такие слова перепутать нельзя. На скринах тоже это написано.
0
840 / 347 / 67
Регистрация: 20.11.2012
Сообщений: 809
07.01.2013, 12:48
Указатели - на стеке.
Миниатюры
Указатели (Выделение памяти в куче)  
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.01.2013, 12:52
Цитата Сообщение от 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
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:58  [ТС]
Ага. Тогда наверное так: Первый вариант создаётся И на стеке и в динамически распределяемой памяти, а второй вариант тот что БЕЗ слова new создаётся только на стеке?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.01.2013, 13:00
Цитата Сообщение от koderman Посмотреть сообщение
C++
1
2
unsigned short int*pPointer 
Ppointer=new unsigned short int
Цитата Сообщение от koderman Посмотреть сообщение
Ага. Тогда наверное так: Первый вариант создаётся И на стеке и в динамически распределяемой памяти, а второй вариант тот что БЕЗ слова new создаётся только на стеке?
именно так, только небольшое уточнение
в динамической памяти создается объект(переменная типа unsigned short int), а затем уже на стеке создается переменная которая сожержит адрес этого объекта
1
07.01.2013, 13:25

Не по теме:

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

0
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 13:51  [ТС]
Ну вот опять недопонимание. В конце концов ведь выяснилось совсем другое.
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
07.01.2013, 14:47
koderman, просто поймите, что указатель сам по себе это отдельная переменная, которая хранит адрес другой переменной. При этом располагаться они могут в разных видах памяти.

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

C++
1
int * ptr = new int;
Сам указатель опять же, создан на стеке, но содержит адрес объекта, созданного в динамически распределяемой памяти.
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
07.01.2013, 14:58
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
int main(){
    int var=123;
    int **p=new int*;
    *p=&var;
    std::cout<<**p<<std::endl;
    delete p;
    return 0;
}
Например, для этого кода, связи такие:

в данном случае **p выделен на стеке, указатель *p выделен в динамической памяти, переменная var на стеке
0
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
09.01.2013, 18:13  [ТС]
C++
1
2
3
4
5
6
7
class Rectangle
 
Rectangle* pRect = new Rectangle;
 
const Rectangle * pConstRect = new Rectangle;
 
Rectangle * const pConstPtr = new Rectangle;

Чем отличается это:
C++
1
const Rectangle * pConstRect = new Rectangle;
от этого:
C++
1
Rectangle * const pConstPtr = new Rectangle;
Первое это указатель на объект класса, второе вроде тоже указатель на объект класса? И все переменные которые вызываются с помощью этих объектов не могут менять свои значения.
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
09.01.2013, 18:26
Первое - указатель на константные данные. То есть данные, адрес которых он хранит, изменить не получится.
C++
1
2
const int * ptr = new int(100); 
*ptr = 200; // ошибка, пытаемся модифицировать данные, на которые указывает ptr
Второе - константный указатель. То есть ему не получится присвоить другой адрес.

C++
1
2
int * const ptr = new int(100); 
ptr = new int(200); // ошибка, пытаемся присвоить указателю адрес нового блока памяти
Пример с типом int, с классом аналогично.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.01.2013, 18:26
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru