Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
3 / 3 / 1
Регистрация: 26.02.2011
Сообщений: 99

Поясните, пожалуйста, несколько моментов про выделение памяти

15.12.2012, 16:58. Показов 2206. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят объясните:
int* a;
a = new a(1);
в первой строке указатель ссылается на какуюто память, те она уже выделена и занять ее ни кто не может?
во второй строке new выделяет память и возвращает указатель, при этом указатель `а` не меняется! хотя new вернул другой указатель
как все это согласовывается где найти статейку как это работает?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.12.2012, 16:58
Ответы с готовыми решениями:

Несколько моментов про хранение в куче и в стеке
Хотел уточнить несколько моментов про хранение в куче и в стеке: 1) Ссылочные типы всегда хранятся в куче? 2) Типы значений всегда...

Поясните, пожалуйста, условие задачи про Дек в Дельфи
Дано: Дек. Добавление в начало и в конец. Удаление из начала и конца. Показать все, удалить все, показать количество элементов. 1 вход ,...

Про выделение памяти
При создании экземпляра класса в куче типа: class A { private: B b; }; Класс B будет создан также в куче или в...

19
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.12.2012, 17:16
1. В первой строке память ещё не выделена.
2. Всегда надо или сразу выделять память в декларации, или сразу в декларации присваивать указателю NULL, или nullptr. А в случае полей объектов в конструкторе.
3. new не возвращает указатель, он возращает адрес, который есть значение указательного типа. Именно значение, а указателем называется переменная для хранения адреса, или именованная константа, чьё значение - адрес. Во втором случае указатель константный. new переменных с константами не возвращает, он возвращает значение.
4. Присваивание указателю адреса меняет значение указателя, вероятность обратного https://www.cyberforum.ru/cgi-bin/latex.cgi?100/(2^{2*n}) процентов, где n - разрядность системы. В системах x32 это 0,0000000000000005421%. Если указатель был инициирован в NULL, или nullptr, как это положено, то имеем гарантию изменения указателя при возможности выделения памяти и выполнении присваивания указателю оператора new. Не меняется только имя указателя.
2
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.12.2012, 17:21
vdvoid, чепуха у вас написана.
0
16 / 5 / 2
Регистрация: 15.12.2012
Сообщений: 26
15.12.2012, 17:35
Цитата Сообщение от vdvoid Посмотреть сообщение
int* a;
Это просто объявление указателя на тип int. Если бы вы вместо
Цитата Сообщение от vdvoid Посмотреть сообщение
a = new a(1);
написали бы *a = 1, то вылезла бы ошибка - использование неинициализированной переменной.
Оператор new выделяет ячейку памяти под указатель и присваивает указателю адрес на эту ячейку.
Да, кстати, должно быть a = new int(1);
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.12.2012, 17:40
Цитата Сообщение от 0x0000005C Посмотреть сообщение
написали бы *a = 1, то вылезла бы ошибка - использование неинициализированной переменной.
Мимо. Компилятор не заметит ничего.

Добавлено через 1 минуту
Цитата Сообщение от go Посмотреть сообщение
Компилятор не заметит ничего.
Ну варнинг кинет, если настроен соответственным образом.
0
16 / 5 / 2
Регистрация: 15.12.2012
Сообщений: 26
15.12.2012, 17:40
Цитата Сообщение от go Посмотреть сообщение
Компилятор не заметит ничего.
Не-а не компилятор. Я про компилятор и не говорил. Это было бы run time error. Моя любимая ошибка)
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.12.2012, 17:42
Цитата Сообщение от 0x0000005C Посмотреть сообщение
Это было бы run time error.
Цитата Сообщение от 0x0000005C Посмотреть сообщение
использование неинициализированной переменной.
А есть такая?
0
16 / 5 / 2
Регистрация: 15.12.2012
Сообщений: 26
15.12.2012, 17:45
Я вот про это:
Миниатюры
Поясните, пожалуйста, несколько моментов про выделение памяти  
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
15.12.2012, 17:52
Цитата Сообщение от 0x0000005C Посмотреть сообщение
Я вот про это:
Это в дебаге! Попробуйте в Release

Не по теме:

ох уж мне эта студия...но нужно, так нужно

2
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.12.2012, 18:08
Цитата Сообщение от 0x0000005C Посмотреть сообщение
Я вот про это:
А я думал Access violation.
А в release скомпилить и запустить .exe? Там то нет отладочной информации - приложение должно свалится
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
15.12.2012, 18:11
Цитата Сообщение от go Посмотреть сообщение
А в release скомпилить и запустить .exe? Там то нет отладочной информации - приложение должно свалится
Кстати, у меня отработало без видимых повреждений. Может че-нидь еще упадет, фиг его знает =))))
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.12.2012, 18:13
Цитата Сообщение от go Посмотреть сообщение
Компилятор не заметит ничего.
Не заметит, а ошибка велезет. В рантайме.
0
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
15.12.2012, 18:43
Цитата Сообщение от vdvoid
в первой строке указатель ссылается на какуюто память, те она уже выделена и занять ее ни кто не может?
это просто объявление переменной типа int* - "указатель на int".
указатель - переменная, хранящая адрес некоторого объекта в динамически распределяемой памяти (heap). объявление переменной подразумевает выделение под нее памяти в программном стеке.
но объявление переменной не означает ее инициализацию (определение). то есть, на данном этапе указатель создан, но не инициализирован адресом. он никуда не ссылается ( у него нет референта )
конечно стек грязный, и физически в а на момент создания будет какое-то число, но оно не имеет смысла. это не адрес, а хаотичный набор бит.
поэтому, например, компилятор Visual Studio выдаст вам ошибку "используется не инициализированная переменная", если вы попробуете использовать такой указатель.
Цитата Сообщение от vdvoid
a = new a(1);
это бред. в операторе new указывается тип создаваемого объекта. должно быть так:
C++
1
a = new int(1)
в этом случае new создаст в heap переменную типа int со значением 1 и возвратит ее адрес. возвращенный адрес помещается в переменную-указатель а. теперь указатель а имеет референт - переменную со значением 1.
если напишите
C++
1
cout<<a;
увидите на экране возвращенный new адрес.
а используя оператор разыменования указателя (*), можно обратиться к самой переменной, адрес которой содержится в а.
например
C++
1
cout<<*a;
выведет вам 1
0
3 / 3 / 1
Регистрация: 26.02.2011
Сообщений: 99
17.12.2012, 00:23  [ТС]
да непонятно вот что:

Добавлено через 8 минут
это я все понимаю что вы написали, я опечатался( спешил, непонятно вот что:
C++
1
2
3
4
5
6
int* a;
cout << &a << endl; // 0xbfb15410 указывает на эту область памяти, делаем sizeof(*a) - 4, в а значит есть какаято инфа о типе, но размещаться в ней может что угодно
a = new int(1);
cout << &a << endl; // 0xbfb15410 после выделения памяти адрес тотже, то есть память по этому адресу заполнилась, хотя в сточке ниже для примера new возвращает другой адрес
cout << (new int(1)); // 0x9067400
return 0;
как все это согласовывается?
компилятор g++
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
17.12.2012, 00:26
Цитата Сообщение от vdvoid Посмотреть сообщение
cout << &a
это адрес самого указателя, а не адрес, записанный в указатель
sizeof(*a)
получаем
C++
1
sizeof(a[0]);
0
3 / 3 / 1
Регистрация: 26.02.2011
Сообщений: 99
17.12.2012, 00:28  [ТС]
еще вот что интересно
C++
1
2
T* p1 = new T; // конструктор вызывается
T* p2 = (T*) operator new (sizeof(T)); // не вызывается почему?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
17.12.2012, 00:33
Цитата Сообщение от vdvoid Посмотреть сообщение
еще вот что интересно
C++
1
2
T* p1 = new T; // конструктор вызывается
T* p2 = (T*) operator new (sizeof(T)); // не вызывается почему?
А Вы понимаете разницу между функцией, перегрузкой,перекрытием,оператором, выражением?
может стоит вернуться к началу изучения?
0
3 / 3 / 1
Регистрация: 26.02.2011
Сообщений: 99
17.12.2012, 01:07  [ТС]
про перекрытие не слышал остальное хорошо знаю

Добавлено через 27 минут
я так понимаю, сорри за тупость)
C++
1
void* operator new(std::size_t) throw (std::bad_alloc);
C++
1
T* p1 = new T;
с этой строке size берется из T следующим за new, затем вызывается конструктор выражением T
C++
1
T* p2 = (T*) operator new (sizeof(T));
а здесь выражения T нет и конструктор не вызывается поэтому?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
17.12.2012, 01:33
Цитата Сообщение от vdvoid Посмотреть сообщение
а здесь выражения T нет и конструктор не вызывается поэтому?
Управление памятью

Добавлено через 7 минут
Думаю, что это пояснит:
C++
1
A* a=(A*)malloc(sizeof(A));
1
3 / 3 / 1
Регистрация: 26.02.2011
Сообщений: 99
17.12.2012, 01:36  [ТС]
спасибо годная ссылка)

на стековерфлов прочел:
The compiler generates machine code for that. When the compiler sees

CSomeClass* object = new CSomeClass();

(new statement) it generates code that calls the appropriate operator new() (which allocates memory), calls the right constructor, calls destructors of all fully constructed subobjects in case of exception, calls operator delete() in case an exception occurs during construction. All this is done by extra machine code generated by the C++ compiler for that simply looking statement.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.12.2012, 01:36
Помогаю со студенческими работами здесь

Поясните пару моментов Java и Android Studio
Изучаю программирование Android (http://startandroid.ru) в Android Studio без знания Java и Android Studio) Видимо уроки там устарели...

не очень понял про динамическое выделение памяти.
У меня есть массив строк состоящий из 100 элементов string *строки; строки = new string ; Но при использовании я не знаю...

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде динамического массива типа short int, каждая...

Несколько моментов программирования
1. Как запустить приложение в фоновом режиме и какие ограничения существуют? 2. Как определить сколько свободного пространства осталось в...

Несколько не понятных моментов
Добрый день. Увидел на данном форуме просьбу в решении не сложной задачи: &quot;найти максимальное число из двух введенных&quot;. Что может...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru