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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
#1

Ссылки и оператор new! - C++

15.02.2010, 03:11. Просмотров 1106. Ответов 10
Метки нет (Все метки)

Вопрос заключается в следующем! Как можно освободить динамическую память, адрес которой присвоен ссылке?
Пример фрагмента кода:

C++
1
2
int *pint=new int(5);
int &rint=*pint;
Как освободить область в куче? *pint.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2010, 03:11     Ссылки и оператор new!
Посмотрите здесь:

Оператор -> C++ - C++
В статье о С++11 наткнулся на следующий код template <typename T1, typename T2> auto add(T1 t1, T2 t2) -> decltype(t1 + t2) { ...

Оператор while - C++
Доброго времени суток всем! Только-только начал изучать плюсы и возникла проблема при выполнении задания. Задание: написать программу...

C++/ Оператор for - C++
1. Посчитать суму чисел от 100 до 200 которые кратные 17 2. Каждые 3 часа амёба надвое, посчитать сколько будет амёб будет...

оператор new - C++
Есть массив: static int *p=new int ; // call-счётчик вызовов требуется каждый раз выделять память и при этом сохранять все данные...

Оператор do-while - C++
Можно ли сделать так,чтобы через оператор while выполнялось пошаговое появление букв(к примеру слово НОУТБУК) и чтобы оно проходило не 1...

оператор if - C++
В небоскребе N этажей и всего один подъезд; на каждом этаже по 3 квартиры; лифт может останавливаться только на нечетных этажах. Человек...

оператор new - C++
Максимальный обьем динамической памяти оператором new определяется фиксированным размером памяти выделенной только для этой программы или...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.02.2010, 05:40     Ссылки и оператор new! #2
Ссылка не может быть NULL, поэтому освобождения памяти, на которую она указывает, нельзя допускать в течении всего времени существования самой ссылки, то есть до закрытия функции, в которой ссылка объявлена, а если ссылка ещё и static, то до закрытия всей программы. А освобождать указатель, которому эта ссылка равна.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
15.02.2010, 08:05     Ссылки и оператор new! #3
Alexandr_LN,
раз выделяешь через new, удалять нужно через delete.
C
1
delete pint;
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
15.02.2010, 10:58  [ТС]     Ссылки и оператор new! #4
да можно сделать delete pint; но на что тогда будет указывать ссылка rint???
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
15.02.2010, 11:09     Ссылки и оператор new! #5
Alexandr_LN, ссылка - не указывает. Ссылка - это фактический псевдоним (хотя в дебрях компилятора, ссылочный механизм и реализуется через указатели).

Поэтому rint будет все тем же - *pint. То есть значением, лежащим по адрессу pint.

p.s: если твой вопрос вызван этой строкой
C++
1
delete pint;
то delete - не удаляет переменную pint, а удаляет выделенную область памяти через new (помечает как неиспользуемой). и после такого удаления, всегда можно использовать переменную pint далее... например для нового выделения памяти.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
15.02.2010, 11:10     Ссылки и оператор new! #6
Цитата Сообщение от Alexandr_LN Посмотреть сообщение
да можно сделать delete pint; но на что тогда будет указывать ссылка rint???
не понял... тогда зачем тебе удалять массив, если ты им еще пользуешься?
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
15.02.2010, 22:01  [ТС]     Ссылки и оператор new! #7
Да delete не удаляет pint, а освобождает динамическую память, но после этой операции, ЧТО будет с ссылкой, на что она будет ссылаться???
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.02.2010, 22:08     Ссылки и оператор new! #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Ссылка не может быть NULL
C++
1
2
char *pc = NULL;
char& rc = *pc;
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
15.02.2010, 22:13     Ссылки и оператор new! #9
Цитата Сообщение от Alexandr_LN Посмотреть сообщение
ЧТО будет с ссылкой, на что она будет ссылаться???
еще раз повторяю.

ссылка - это псевдоним. она как была псевдонимом *pint так и останется. ибо
C++
1
delete pint;
на сам pint никак не влияет.

Лучше задай вопрос, что происходит с переменной pint. Она хранит адрес.

Когда ты делаешь
C++
1
int *pint=new int(5);
у нас выделяется область памяти под переменную типа int (причем переменная инициализуерся значением 5) и возвращается адрес выделенной области памяти, который присваевается переменной-указателю pint.

Когда ты после этого делаешь
C++
1
delete pint;
у тебя область памяти удаляется (если быть конкретней, то помечается как свободная память, поэтому некоторое время там вполне может хранится значение 5), но переменная pint как была так и осталась.. более того, она продолжает содержать адрес того участка памяти, на который она ссылалась. Но данный участок памяти более не принадлежит нашей программе, более того, там могут располагаться жизненно важные данные другой программы и запись в эту область может очень повредить (хотя сработают методы защиты, но все же их тоже можно обойти). поэтому лучше всегда делать так:

C++
1
2
delete pint;
pint = 0;
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
15.02.2010, 23:17  [ТС]     Ссылки и оператор new! #10
Значит получается, что после pint=0; в указателе содержится нулевой адрес.
А ссылка не равна NULL так как она просто псевдоним указателя, правда хоть он и нулевой.
Это вроде этого:

int a=0;
int &ra=a;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2010, 23:23     Ссылки и оператор new!
Еще ссылки по теме:

Оператор a % b - C++
Этот оператор возвращает 1, если a делится на b или же возвращает остаток от деления? Лично у меня он возвращает исключительно единицу или...

Оператор while - C++
Поскольку я еще начинающий, то задам такой вопрос: В цикл while мне нужно поставить несколько условий, вот, что я пишу: while (a1 = a2;...

Оператор if - C++
Написал код с оператором условий if...else, мне нужно что бы он проверял условие пример if (y=2) и выполнял одно действие, но когда я...

Оператор >> - C++
Приветствую. Подскажите, пожалуйста, что означает ">>" в С/С++: size_learnt >> 1;

оператор if - C++
помогите с оператором if нужно сделать условие такого типа if(<условие1> или <условие2>) как именно сделать вот это или? помогите,...


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

Или воспользуйтесь поиском по форуму:
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
15.02.2010, 23:23     Ссылки и оператор new! #11
Цитата Сообщение от Alexandr_LN Посмотреть сообщение
Значит получается, что после pint=0; в указателе содержится нулевой адрес.
только это не нулевой адрес. это специальное значение указателя, которое говорит, что указатель не указывает ни на что.

даже код

C++
1
2
int *ptr = 0;
delete ptr;
не выбросит исключение, так как это допустимо.
Yandex
Объявления
15.02.2010, 23:23     Ссылки и оператор new!
Ответ Создать тему
Опции темы

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