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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
15.02.2010, 03:11     Ссылки и оператор new! #1
Вопрос заключается в следующем! Как можно освободить динамическую память, адрес которой присвоен ссылке?
Пример фрагмента кода:

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++ Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1
Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки C++
Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. C++
C++ Оператор break как оператор go to next
C++ Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для 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
 Аватар для Monte-Cristo
2805 / 1370 / 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
 Аватар для zim22
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
 Аватар для Monte-Cristo
2805 / 1370 / 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!
Еще ссылки по теме:

C++ В Delphi есть оператор cost i of. и т.д. Есть ли в C++ такой же оператор?
C++ Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости

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

Или воспользуйтесь поиском по форуму:
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 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!
Ответ Создать тему
Опции темы

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