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

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

Войти
Регистрация
Восстановить пароль
 
 
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
#1

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

28.02.2014, 21:51. Просмотров 718. Ответов 19
Метки нет (Все метки)

Имеется код:
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 []?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2014, 21:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что будет с указателем после использования операции delete? (C++):

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

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

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

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

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

Допустимые операции с нулевым указателем - C++
Не if (all) delete all;, а delete all; если че, ТС не я :D Это вырезано из другой темы (не моей) и создана как отдельная. Эта...

19
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
28.02.2014, 21:54 #2
Цитата Сообщение от mariko_11 Посмотреть сообщение
В ОБЩЕМ СЛУЧАЕ значение указателя после применения к нему операции delete?
тоже самое. Адрес не меняется
0
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
28.02.2014, 21:55  [ТС] #3
Croessmah, Где это написано?
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
28.02.2014, 23:01 #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, никак не изменяется.
1
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,254
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
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.03.2014, 11:42 #6
Цитата Сообщение от ValeryS Посмотреть сообщение
я попытаюсь по проще объяснить
Есть дом по адресу ул.Ленина, д.42. Его снесли. Дома нет, а адрес остался.
Понятно, что через некоторое время и адреса не останется, но это же происходит в программе, когда указатель выходит из области видимости.
1
ValeryS
01.03.2014, 11:44
  #7

Не по теме:

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

0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 20:58 #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Есть дом по адресу ул.Ленина, д.42. Его снесли. Дома нет, а адрес остался.
Понятно, что через некоторое время и адреса не останется, но это же происходит в программе, когда указатель выходит из области видимости.
Тут вопрос о другом.
Цитата Сообщение от mariko_11 Посмотреть сообщение
То есть, каково В ОБЩЕМ СЛУЧАЕ значение указателя после применения к нему операции delete? А как обстоят дела с delete []?
Не о том, что происходит со значением указателя, когда указатель выходит из области видимости, а о том, что происходит со значением указателя после delete. Например, в других библиотеках есть указатели (guarded pointer), которые автоматически принимают значение null, когда объект, на который они указывают, удаляется (например в Qt: класс QPointer).
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.03.2014, 22:07 #9
Цитата Сообщение от alsav22 Посмотреть сообщение
указатель выходит из области видимости, а о том, что происходит со значением указателя после delete.
так это и есть аналогия про снесенный дом (delete), а выход из области видимости уже потом.
Цитата Сообщение от alsav22 Посмотреть сообщение
класс QPointer
В другие библиотеки ходить даже не обязательно. Возьмите std::unique_ptr хотя бы.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 22:23 #10
Цитата Сообщение от Tulosba Посмотреть сообщение
В другие библиотеки ходить даже не обязательно. Возьмите std::unique_ptr хотя бы.
Тем более. Для std::unique_ptr аналогия со снесённым домом подходит?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.03.2014, 23:15 #13
alsav22, Вы зачем-то смешали всё в кучу. Никаких разговоров до Вашего сообщения #8 об умных указателях не было. Всё что хотел знать ТС, это что будет с сырым указателем после применения к нему оператора delete. И ответ был дан незамедлительно (#2), а потом в сообщении #4 он был развернут.
0
Croessmah
01.03.2014, 23:16
  #14

Не по теме:

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

0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 23:21 #15

Не по теме:

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



Добавлено через 2 минуты
Рзаговор о том, что если рассматривать обычный указатель, то аналогия с домом подходит, но есть (в других библиотеках, std::unique_ptr) указатели, к которым эта аналогия не подходит, вот и всё.
0
01.03.2014, 23:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2014, 23:21
Привет! Вот еще темы с ответами:

Операции new и delete - C++
Привет всем! У меня вопрос по указателям. Вот я создал массив указателей. Через new я каждому присвоил значение 0. int* ptr; for...

Нюансы использования операторов new/delete в деструкторах - C++
Подскажите пожалуйста, в чем проблема у меня в деструкторах? Есть 3 класса(по порядку размещения ниже), когда первые 2 удаляются все...

Будет ли работать должным образом конструктор копирование с указателем? - C++
class A { A() {} A(const A *); } То что этот код скомпилируется - сомнений нет. Вот есть сомнения по поводу его...

Что будет выведено после выполнения следующего фрагмента программы: - C++
int main() { int a = 3; int b = 4; int c = 5; int &amp;d = b; a = b = c; cout &lt;&lt; a &lt;&lt; b &lt;&lt; c &lt;&lt; d &lt;&lt;...


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

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

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