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

Что будет с указателем после использования операции delete? - C++

Восстановить пароль Регистрация
 
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
28.02.2014, 21:51     Что будет с указателем после использования операции delete? #1
Имеется код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
int main()
{
    int *wtf_ptr;
 
    wtf_ptr=new int(8);
 
    cout << *wtf_ptr << "\t" << wtf_ptr << endl;
 
    delete wtf_ptr;
 
    cout << *wtf_ptr << "\t" << wtf_ptr << endl;
 
    cout << "Hello World!" << endl;
    return 0;
}
При выводе содержимого динамической переменной после применения delete вполне предсказуемо видим мусорное значение. Гораздо интереснее ситуация со значением адреса переменной, который хранится в указателе. И до уничтожения объекта, и после там хранится один и тот же адрес. Вопрос: а обязан ли ? То есть, каково В ОБЩЕМ СЛУЧАЕ значение указателя после применения к нему операции delete? А как обстоят дела с delete []?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2014, 21:51     Что будет с указателем после использования операции delete?
Посмотрите здесь:

в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! C++
Будет ли работать должным образом конструктор копирование с указателем? C++
Динамический массив структур. Почему данные доступны после выполнения операции delete [] C++
C++ Что будет выведено после выполнения следующего фрагмента программы:
Что будет находится в переменных a и b после выполнения следующего фрагмента C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
28.02.2014, 21:54     Что будет с указателем после использования операции delete? #2
Цитата Сообщение от mariko_11 Посмотреть сообщение
В ОБЩЕМ СЛУЧАЕ значение указателя после применения к нему операции delete?
тоже самое. Адрес не меняется
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
28.02.2014, 21:55  [ТС]     Что будет с указателем после использования операции delete? #3
Croessmah, Где это написано?
DrOffset
6457 / 3831 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
28.02.2014, 23:01     Что будет с указателем после использования операции delete? #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
mariko_11,
В стандарте написано следующее (5.3.5/1):
The operand shall have a pointer to object type, or a class type having a single non-explicit conversionfunction (12.3.2) to a pointer to object type. The result has type void.
Т.к. delete-expression определяется как:
delete-expression:
::optdelete cast-expression
::optdelete [ ] cast-expression
и принимая во внимания процитированный абзац, легко сделать вывод, что delete-expression принимает нечто, что можно скастить к pointer to object type.
Смотрим что такое cast-expression (5.4/1):
The result of the expression (T) cast-expression is of type T. The result is an lvalue if T is an lvalue reference
type or an rvalue reference to function type and an xvalue if T is an rvalue reference to object type; otherwise the result is a prvalue.
Выделил наш случай, потому что каст к T='pointer to object type' подходит только под последнее условие.
Теперь осталось самое простое, посмотреть на prvalue (3.10/1):
— An rvalue (so called, historically, because rvalues could appear on the right-hand side of an assignment
expression) is an xvalue, a temporary object (12.2) or subobject thereof, or a value that is not associated
with an object.

— A prvalue (“pure” rvalue) is an rvalue that is not an xvalue.
В соответствии с выделенным становится понятно, что результатом cast-expression к указателю может быть только временный указатель.
Следовательно оригинал, ставший аргументом delete, никак не изменяется.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
28.02.2014, 23:12     Что будет с указателем после использования операции delete? #5
Цитата Сообщение от mariko_11 Посмотреть сообщение
Вопрос: а обязан ли ?
да
DrOffset, привел ссылки на стандарт я попытаюсь по проще объяснить

C++
1
delete a;
это можно рассматривать как функцию принимающую аргументы по значению
в ассемблере это будет выглядеть так
C++
1
2
push a;
call delete;
delete работает с копией
так же как
C++
1
2
3
4
5
6
7
fnc(int a)
 {
 a=5;
}
.......................
int a1=0;
fnc(a1);
так же как и fnc не меняет значения a1 так и delete не меняет значения своего аргумента
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.03.2014, 11:42     Что будет с указателем после использования операции delete? #6
Цитата Сообщение от ValeryS Посмотреть сообщение
я попытаюсь по проще объяснить
Есть дом по адресу ул.Ленина, д.42. Его снесли. Дома нет, а адрес остался.
Понятно, что через некоторое время и адреса не останется, но это же происходит в программе, когда указатель выходит из области видимости.
ValeryS
01.03.2014, 11:44
  #7

Не по теме:

Tulosba,
тоже правильно

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 20:58     Что будет с указателем после использования операции delete? #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Есть дом по адресу ул.Ленина, д.42. Его снесли. Дома нет, а адрес остался.
Понятно, что через некоторое время и адреса не останется, но это же происходит в программе, когда указатель выходит из области видимости.
Тут вопрос о другом.
Цитата Сообщение от mariko_11 Посмотреть сообщение
То есть, каково В ОБЩЕМ СЛУЧАЕ значение указателя после применения к нему операции delete? А как обстоят дела с delete []?
Не о том, что происходит со значением указателя, когда указатель выходит из области видимости, а о том, что происходит со значением указателя после delete. Например, в других библиотеках есть указатели (guarded pointer), которые автоматически принимают значение null, когда объект, на который они указывают, удаляется (например в Qt: класс QPointer).
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.03.2014, 22:07     Что будет с указателем после использования операции delete? #9
Цитата Сообщение от alsav22 Посмотреть сообщение
указатель выходит из области видимости, а о том, что происходит со значением указателя после delete.
так это и есть аналогия про снесенный дом (delete), а выход из области видимости уже потом.
Цитата Сообщение от alsav22 Посмотреть сообщение
класс QPointer
В другие библиотеки ходить даже не обязательно. Возьмите std::unique_ptr хотя бы.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 22:23     Что будет с указателем после использования операции delete? #10
Цитата Сообщение от Tulosba Посмотреть сообщение
В другие библиотеки ходить даже не обязательно. Возьмите std::unique_ptr хотя бы.
Тем более. Для std::unique_ptr аналогия со снесённым домом подходит?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
01.03.2014, 22:36     Что будет с указателем после использования операции delete? #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Для std::unique_ptr аналогия со снесённым домом подходит?
конечно, потому что в какой-то книге учета сделают пометку что дома больше нет и место свободно. Причем сделают это явно без людей, которые этот дом сносили
alsav22
01.03.2014, 23:02
  #12

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
конечно, потому что в какой-то книге учета сделают пометку что дома больше нет и место свободно.
Читаем аналогию Tulosba:
Цитата Сообщение от Tulosba Посмотреть сообщение
Его снесли. Дома нет, а адрес остался.
Подходит для, например, QPointer(std::unique_ptr не знаю)? Нет. Дом снесли, адрес стал null.

Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.03.2014, 23:15     Что будет с указателем после использования операции delete? #13
alsav22, Вы зачем-то смешали всё в кучу. Никаких разговоров до Вашего сообщения #8 об умных указателях не было. Всё что хотел знать ТС, это что будет с сырым указателем после применения к нему оператора delete. И ответ был дан незамедлительно (#2), а потом в сообщении #4 он был развернут.
Croessmah
01.03.2014, 23:16
  #14

Не по теме:

alsav22, от того что снесли дом, план города не поменялся. Он поменяется только когда кто-то соизволит им заняться(этакая обертка)

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 23:21     Что будет с указателем после использования операции delete? #15

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
alsav22, от того что снесли дом, план города не поменялся. Он поменяется только когда кто-то соизволит им заняться(этакая обертка)
Это о чём? Причём здесь план города? Разговор об адресе дома: остаётся адес старым, когда дом сносят или меняется.



Добавлено через 2 минуты
Рзаговор о том, что если рассматривать обычный указатель, то аналогия с домом подходит, но есть (в других библиотеках, std::unique_ptr) указатели, к которым эта аналогия не подходит, вот и всё.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
01.03.2014, 23:25     Что будет с указателем после использования операции delete? #16
Цитата Сообщение от alsav22 Посмотреть сообщение
указатели, к которым эта аналогия не подходит, вот и всё.
это не указатели, это обертки над ними!!!
И аналогия с домом как раз таки для них тоже подходит:
Строители сносят здание (delete).
Организация, которая это контролирует, помечает дом везде как снесенный и что тут ничего нет уже(обертка над указателем).
alsav22
01.03.2014, 23:32
  #17

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
это не указатели, это обертки над ними!!!
И аналогия с домом как раз таки для них тоже подходит:
Строители сносят здание (delete).
Организация, которая это контролирует, помечает дом везде как снесенный и что тут ничего нет уже(обертка над указателем).
И что это меняет? Значение указателя меняется, после удаления объекта, с которым он связан, или остаётся прежним? Меняется. Я не обсуждаю вопрос: как и с помощью чего (обёртки или не обёртки).

Croessmah
01.03.2014, 23:35
  #18

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Меняется.
delete - не меняет адрес, в этом весь ответ.
Адрес может поменять стороннее средство, а не delete, тем более я могу написать обертку, которая, например, будет оставлять адрес прежним, так что это зависит уже не от delete

DrOffset
6457 / 3831 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
01.03.2014, 23:38     Что будет с указателем после использования операции delete? #19
Цитата Сообщение от alsav22 Посмотреть сообщение
И что это меняет? Значение указателя меняется, после удаления объекта, с которым он связан, или остаётся прежним? Меняется
Если оставаться в рамках темы, то значение указателя в такой обертке меняется ведь не потому что delete начинает себя вести по-другому, а потому что, грубо говоря, там написали код:
C++
1
2
delete a;
a = 0;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2014, 23:41     Что будет с указателем после использования операции delete?
Еще ссылки по теме:

C++ Допустимые операции с нулевым указателем
Операции new и delete C++
Операции с указателем к char[] C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 23:41     Что будет с указателем после использования операции delete? #20

Не по теме:

Возможно я не совсем правильно понял смысл 6-го поста Tulosba.



Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
delete - не меняет адрес, в этом весь ответ.
Согласен.

Добавлено через 36 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Если оставаться в рамках темы, то значение указателя в такой обертке меняется ведь не потому что delete начинает себя вести по-другому,
Согласен.
Yandex
Объявления
01.03.2014, 23:41     Что будет с указателем после использования операции delete?
Ответ Создать тему
Опции темы

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