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

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

06.01.2013, 22:27. Показов 3946. Ответов 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
841 / 347 / 68
Регистрация: 20.11.2012
Сообщений: 814
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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru