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

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

Восстановить пароль Регистрация
 
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
15.12.2012, 16:58     Поясните, пожалуйста, несколько моментов про выделение памяти #1
Ребят объясните:
int* a;
a = new a(1);
в первой строке указатель ссылается на какуюто память, те она уже выделена и занять ее ни кто не может?
во второй строке new выделяет память и возвращает указатель, при этом указатель `а` не меняется! хотя new вернул другой указатель
как все это согласовывается где найти статейку как это работает?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2012, 16:58     Поясните, пожалуйста, несколько моментов про выделение памяти
Посмотрите здесь:

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

Добавлено через 1 минуту
Цитата Сообщение от go Посмотреть сообщение
Компилятор не заметит ничего.
Ну варнинг кинет, если настроен соответственным образом.
0x0000005C
16 / 5 / 1
Регистрация: 15.12.2012
Сообщений: 26
15.12.2012, 17:40     Поясните, пожалуйста, несколько моментов про выделение памяти #6
Цитата Сообщение от go Посмотреть сообщение
Компилятор не заметит ничего.
Не-а не компилятор. Я про компилятор и не говорил. Это было бы run time error. Моя любимая ошибка)
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.12.2012, 17:42     Поясните, пожалуйста, несколько моментов про выделение памяти #7
Цитата Сообщение от 0x0000005C Посмотреть сообщение
Это было бы run time error.
Цитата Сообщение от 0x0000005C Посмотреть сообщение
использование неинициализированной переменной.
А есть такая?
0x0000005C
16 / 5 / 1
Регистрация: 15.12.2012
Сообщений: 26
15.12.2012, 17:45     Поясните, пожалуйста, несколько моментов про выделение памяти #8
Я вот про это:
Миниатюры
Поясните, пожалуйста, несколько моментов про выделение памяти  
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12079 / 6940 / 782
Регистрация: 27.09.2012
Сообщений: 17,208
Записей в блоге: 2
Завершенные тесты: 1
15.12.2012, 17:52     Поясните, пожалуйста, несколько моментов про выделение памяти #9
Цитата Сообщение от 0x0000005C Посмотреть сообщение
Я вот про это:
Это в дебаге! Попробуйте в Release

Не по теме:

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

go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.12.2012, 18:08     Поясните, пожалуйста, несколько моментов про выделение памяти #10
Цитата Сообщение от 0x0000005C Посмотреть сообщение
Я вот про это:
А я думал Access violation.
А в release скомпилить и запустить .exe? Там то нет отладочной информации - приложение должно свалится
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12079 / 6940 / 782
Регистрация: 27.09.2012
Сообщений: 17,208
Записей в блоге: 2
Завершенные тесты: 1
15.12.2012, 18:11     Поясните, пожалуйста, несколько моментов про выделение памяти #11
Цитата Сообщение от go Посмотреть сообщение
А в release скомпилить и запустить .exe? Там то нет отладочной информации - приложение должно свалится
Кстати, у меня отработало без видимых повреждений. Может че-нидь еще упадет, фиг его знает =))))
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.12.2012, 18:13     Поясните, пожалуйста, несколько моментов про выделение памяти #12
Цитата Сообщение от go Посмотреть сообщение
Компилятор не заметит ничего.
Не заметит, а ошибка велезет. В рантайме.
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
15.12.2012, 18:43     Поясните, пожалуйста, несколько моментов про выделение памяти #13
Цитата Сообщение от 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
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
17.12.2012, 00:23  [ТС]     Поясните, пожалуйста, несколько моментов про выделение памяти #14
да непонятно вот что:

Добавлено через 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++
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12079 / 6940 / 782
Регистрация: 27.09.2012
Сообщений: 17,208
Записей в блоге: 2
Завершенные тесты: 1
17.12.2012, 00:26     Поясните, пожалуйста, несколько моментов про выделение памяти #15
Цитата Сообщение от vdvoid Посмотреть сообщение
cout << &a
это адрес самого указателя, а не адрес, записанный в указатель
sizeof(*a)
получаем
C++
1
sizeof(a[0]);
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
17.12.2012, 00:28  [ТС]     Поясните, пожалуйста, несколько моментов про выделение памяти #16
еще вот что интересно
C++
1
2
T* p1 = new T; // конструктор вызывается
T* p2 = (T*) operator new (sizeof(T)); // не вызывается почему?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12079 / 6940 / 782
Регистрация: 27.09.2012
Сообщений: 17,208
Записей в блоге: 2
Завершенные тесты: 1
17.12.2012, 00:33     Поясните, пожалуйста, несколько моментов про выделение памяти #17
Цитата Сообщение от vdvoid Посмотреть сообщение
еще вот что интересно
C++
1
2
T* p1 = new T; // конструктор вызывается
T* p2 = (T*) operator new (sizeof(T)); // не вызывается почему?
А Вы понимаете разницу между функцией, перегрузкой,перекрытием,оператором, выражением?
может стоит вернуться к началу изучения?
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
17.12.2012, 01:07  [ТС]     Поясните, пожалуйста, несколько моментов про выделение памяти #18
про перекрытие не слышал остальное хорошо знаю

Добавлено через 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 нет и конструктор не вызывается поэтому?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12079 / 6940 / 782
Регистрация: 27.09.2012
Сообщений: 17,208
Записей в блоге: 2
Завершенные тесты: 1
17.12.2012, 01:33     Поясните, пожалуйста, несколько моментов про выделение памяти #19
Цитата Сообщение от vdvoid Посмотреть сообщение
а здесь выражения T нет и конструктор не вызывается поэтому?
Управление памятью

Добавлено через 7 минут
Думаю, что это пояснит:
C++
1
A* a=(A*)malloc(sizeof(A));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2012, 01:36     Поясните, пожалуйста, несколько моментов про выделение памяти
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
17.12.2012, 01:36  [ТС]     Поясните, пожалуйста, несколько моментов про выделение памяти #20
спасибо годная ссылка)

на стековерфлов прочел:
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.
Yandex
Объявления
17.12.2012, 01:36     Поясните, пожалуйста, несколько моментов про выделение памяти
Ответ Создать тему
Опции темы

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