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

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

Войти
Регистрация
Восстановить пароль
 
 
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
#1

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

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

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

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

Поясните, пожалуйста. - C++
Что означает "%d" Arr и sizeof в си?

поясните пожалуйста код - C++
#include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <iomanip.h> ...

Поясните строку пожалуйста - C++
Предположим все переменныe равны 5. вот есть такие строки product += x++; qu += ++x; я понимаю это так product = product + x++;...

Поясните пожалуйста условие оператора - C++
Понимаю, что вопрос смешной, но уж лучше спрошу, чем останусь в незнании.. Вопрос, что выведет эта программа.. долго думал, что же за...

Поясните пожалуйста пару строк кода - C++
Доброго времени суток. Помогите пожалуйста "по научному" объяснить пару строчек кода, препода мое объяснение не устраивает(( ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
taras atavin
Ушёл с форума.
3569 / 1753 / 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. Не меняется только имя указателя.
2
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.12.2012, 17:21 #3
vdvoid, чепуха у вас написана.
0
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);
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.12.2012, 17:40 #5
Цитата Сообщение от 0x0000005C Посмотреть сообщение
написали бы *a = 1, то вылезла бы ошибка - использование неинициализированной переменной.
Мимо. Компилятор не заметит ничего.

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

Не по теме:

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

2
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.12.2012, 18:08 #10
Цитата Сообщение от 0x0000005C Посмотреть сообщение
Я вот про это:
А я думал Access violation.
А в release скомпилить и запустить .exe? Там то нет отладочной информации - приложение должно свалится
0
Croessmah
Эксперт CЭксперт С++
13228 / 7500 / 845
Регистрация: 27.09.2012
Сообщений: 18,419
Записей в блоге: 3
Завершенные тесты: 1
15.12.2012, 18:11 #11
Цитата Сообщение от go Посмотреть сообщение
А в release скомпилить и запустить .exe? Там то нет отладочной информации - приложение должно свалится
Кстати, у меня отработало без видимых повреждений. Может че-нидь еще упадет, фиг его знает =))))
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.12.2012, 18:13 #12
Цитата Сообщение от go Посмотреть сообщение
Компилятор не заметит ничего.
Не заметит, а ошибка велезет. В рантайме.
0
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
0
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++
0
Croessmah
Эксперт CЭксперт С++
13228 / 7500 / 845
Регистрация: 27.09.2012
Сообщений: 18,419
Записей в блоге: 3
Завершенные тесты: 1
17.12.2012, 00:26 #15
Цитата Сообщение от vdvoid Посмотреть сообщение
cout << &a
это адрес самого указателя, а не адрес, записанный в указатель
sizeof(*a)
получаем
C++
1
sizeof(a[0]);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2012, 00:26
Привет! Вот еще темы с ответами:

Выделение памяти, проверка на утечку памяти - C++
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Поясните, пожалуйста, смысл выделенных строк в тексте программы - C++
Поясните, пожалуйста, смысл выделенных строк в тексте программы. Заранее спасибо #include &quot;stdafx.h&quot; #define im 32 int...

Запись из одного файла в другой, поясните, почему не работает код, пожалуйста - C++
Драйжайшие господа, извольте пожалуйста взглянуть на код, и пояснить мне, почему ничего не получается; Условие следующее: Дан файл f,...


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

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

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