Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
1

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

28.02.2014, 21:51. Показов 5513. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется код:
C++
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 []?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2014, 21:51
Ответы с готовыми решениями:

Используя delete по указателю, возвращенному new [] или delete [] указателем, возвращаемым new
Помогите ответить на вопрос, не могу понять суть вопроса (правильно ли понимаю, что будет если...

Что будет, если new вызвать 2 раза с одним и тем же указателем?
Собственно вопрос что будет? напрмер int *i=new(1); i=new(3); i будет сылаться на ячеку со...

Динамический массив структур. Почему данные доступны после выполнения операции delete []
Всем привет! Выполнил вот такое задание. После того как вывелись данные трех структур, очищаю...

в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант!
Собсно //Это типа служебного класса. (Внимание! В оригинальном коде он вложен в класс xx,...

21
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
28.02.2014, 21:54 2
Цитата Сообщение от mariko_11 Посмотреть сообщение
В ОБЩЕМ СЛУЧАЕ значение указателя после применения к нему операции delete?
тоже самое. Адрес не меняется
0
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
28.02.2014, 21:55  [ТС] 3
Croessmah, Где это написано?
0
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
28.02.2014, 23:01 4
Лучший ответ Сообщение было отмечено mariko_11 как решение

Решение

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, никак не изменяется.
1
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
28.02.2014, 23:12 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 не меняет значения своего аргумента
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.03.2014, 11:42 6
Цитата Сообщение от ValeryS Посмотреть сообщение
я попытаюсь по проще объяснить
Есть дом по адресу ул.Ленина, д.42. Его снесли. Дома нет, а адрес остался.
Понятно, что через некоторое время и адреса не останется, но это же происходит в программе, когда указатель выходит из области видимости.
2
ValeryS
01.03.2014, 11:44
  #7

Не по теме:

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

0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 20:58 8
Цитата Сообщение от Tulosba Посмотреть сообщение
Есть дом по адресу ул.Ленина, д.42. Его снесли. Дома нет, а адрес остался.
Понятно, что через некоторое время и адреса не останется, но это же происходит в программе, когда указатель выходит из области видимости.
Тут вопрос о другом.
Цитата Сообщение от mariko_11 Посмотреть сообщение
То есть, каково В ОБЩЕМ СЛУЧАЕ значение указателя после применения к нему операции delete? А как обстоят дела с delete []?
Не о том, что происходит со значением указателя, когда указатель выходит из области видимости, а о том, что происходит со значением указателя после delete. Например, в других библиотеках есть указатели (guarded pointer), которые автоматически принимают значение null, когда объект, на который они указывают, удаляется (например в Qt: класс QPointer).
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.03.2014, 22:07 9
Цитата Сообщение от alsav22 Посмотреть сообщение
указатель выходит из области видимости, а о том, что происходит со значением указателя после delete.
так это и есть аналогия про снесенный дом (delete), а выход из области видимости уже потом.
Цитата Сообщение от alsav22 Посмотреть сообщение
класс QPointer
В другие библиотеки ходить даже не обязательно. Возьмите std::unique_ptr хотя бы.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 22:23 10
Цитата Сообщение от Tulosba Посмотреть сообщение
В другие библиотеки ходить даже не обязательно. Возьмите std::unique_ptr хотя бы.
Тем более. Для std::unique_ptr аналогия со снесённым домом подходит?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
01.03.2014, 22:36 11
Цитата Сообщение от alsav22 Посмотреть сообщение
Для std::unique_ptr аналогия со снесённым домом подходит?
конечно, потому что в какой-то книге учета сделают пометку что дома больше нет и место свободно. Причем сделают это явно без людей, которые этот дом сносили
0
alsav22
01.03.2014, 23:02
  #12

Не по теме:

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

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

Не по теме:

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

0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 23:21 15

Не по теме:

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



Добавлено через 2 минуты
Рзаговор о том, что если рассматривать обычный указатель, то аналогия с домом подходит, но есть (в других библиотеках, std::unique_ptr) указатели, к которым эта аналогия не подходит, вот и всё.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
01.03.2014, 23:25 16
Цитата Сообщение от alsav22 Посмотреть сообщение
указатели, к которым эта аналогия не подходит, вот и всё.
это не указатели, это обертки над ними!!!
И аналогия с домом как раз таки для них тоже подходит:
Строители сносят здание (delete).
Организация, которая это контролирует, помечает дом везде как снесенный и что тут ничего нет уже(обертка над указателем).
1
alsav22
01.03.2014, 23:32
  #17

Не по теме:

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

0
Croessmah
01.03.2014, 23:35
  #18

Не по теме:

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

0
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
01.03.2014, 23:38 19
Цитата Сообщение от alsav22 Посмотреть сообщение
И что это меняет? Значение указателя меняется, после удаления объекта, с которым он связан, или остаётся прежним? Меняется
Если оставаться в рамках темы, то значение указателя в такой обертке меняется ведь не потому что delete начинает себя вести по-другому, а потому что, грубо говоря, там написали код:
C++
1
2
delete a;
a = 0;
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 23:41 20

Не по теме:

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



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

Добавлено через 36 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Если оставаться в рамках темы, то значение указателя в такой обертке меняется ведь не потому что delete начинает себя вести по-другому,
Согласен.
0
01.03.2014, 23:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2014, 23:41
Помогаю со студенческими работами здесь

После использования операции присваивания ошибку выдает само удаление файла
У меня есть шаблон. Его принцип работы как ArrayList из java. Но есть проблема с удалением...

Какое будет значение Р после выполнения операции логического присваивания?
Значение Р после выполнения операции логического присваивания P:=(2*2=4) and (3*3=10) 1. 14...

Операции с указателем к char[]
Есть некая структура, например WNDCLASSA, где её члены: typedef struct tagWNDCLASSA { UINT ...

Что будет, если клиент арендовал адрес dchp, и во время использования пул изменился?
пул был 192.168.1.2-192.168.1.34 арендован был адрес 192.168.1.13 к примеру изменили на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru