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

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

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

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

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

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

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

Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1 - C++
В С++ я ноль, помогите пожалуйста написать прогу Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1 ...

Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки - C++
Здравствуйте. В С++ я абсолютный новичок, поэтому с первым же заданием возникли определённые трудности. Будьте добры, помогите решить. Буду...

Зачем нужны rvalue ссылки, если есть универсальные ссылки - C++
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue ссылками. Я не пойму, зачем нужны rvalue ссылки, если есть...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости - C++
для чего нужен оператор двоеточие ( : ), если два двоеточия( :: ) - это оператор расширения области видимости.

Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->? - C++
#include <iostream> using namespace std; class random { public: void Set(int b){a=b;} int Get(){return a;} private: ...

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

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

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

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

даже код

C++
1
2
int *ptr = 0;
delete ptr;
не выбросит исключение, так как это допустимо.
1
15.02.2010, 23:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2010, 23:23
Привет! Вот еще темы с ответами:

Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. - C++
Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. Шаг изменения...

Как перегрузить оператор<< и оператор>> ? - C++
Доброго времени суток. Застрял на двух вопросах и не как не могу найти инфу которвя мне помогла бы их решить. вопрос первый. В общем...

Оператор break как оператор go to next - C++
Подскажите, в этом примере break эквивалентна действию оператора go to next?

В Delphi есть оператор cost i of. и т.д. Есть ли в C++ такой же оператор? - C++
(C++ Builder XE5)


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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