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

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

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

Студворк — интернет-сервис помощи студентам
Имеется код:
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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.02.2014, 21:51
Ответы с готовыми решениями:

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

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

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

21
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.02.2014, 21:54
Цитата Сообщение от mariko_11 Посмотреть сообщение
В ОБЩЕМ СЛУЧАЕ значение указателя после применения к нему операции delete?
тоже самое. Адрес не меняется
0
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
28.02.2014, 21:55  [ТС]
Croessmah, Где это написано?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
28.02.2014, 23:01
Лучший ответ Сообщение было отмечено 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
28.02.2014, 23:12
Цитата Сообщение от 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
Цитата Сообщение от ValeryS Посмотреть сообщение
я попытаюсь по проще объяснить
Есть дом по адресу ул.Ленина, д.42. Его снесли. Дома нет, а адрес остался.
Понятно, что через некоторое время и адреса не останется, но это же происходит в программе, когда указатель выходит из области видимости.
2
01.03.2014, 11:44

Не по теме:

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

0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 20:58
Цитата Сообщение от 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
Цитата Сообщение от alsav22 Посмотреть сообщение
указатель выходит из области видимости, а о том, что происходит со значением указателя после delete.
так это и есть аналогия про снесенный дом (delete), а выход из области видимости уже потом.
Цитата Сообщение от alsav22 Посмотреть сообщение
класс QPointer
В другие библиотеки ходить даже не обязательно. Возьмите std::unique_ptr хотя бы.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2014, 22:23
Цитата Сообщение от Tulosba Посмотреть сообщение
В другие библиотеки ходить даже не обязательно. Возьмите std::unique_ptr хотя бы.
Тем более. Для std::unique_ptr аналогия со снесённым домом подходит?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.03.2014, 22:36
Цитата Сообщение от alsav22 Посмотреть сообщение
Для std::unique_ptr аналогия со снесённым домом подходит?
конечно, потому что в какой-то книге учета сделают пометку что дома больше нет и место свободно. Причем сделают это явно без людей, которые этот дом сносили
0
01.03.2014, 23:02

Не по теме:

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

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

Не по теме:

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

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

Не по теме:

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



Добавлено через 2 минуты
Рзаговор о том, что если рассматривать обычный указатель, то аналогия с домом подходит, но есть (в других библиотеках, std::unique_ptr) указатели, к которым эта аналогия не подходит, вот и всё.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.03.2014, 23:25
Цитата Сообщение от alsav22 Посмотреть сообщение
указатели, к которым эта аналогия не подходит, вот и всё.
это не указатели, это обертки над ними!!!
И аналогия с домом как раз таки для них тоже подходит:
Строители сносят здание (delete).
Организация, которая это контролирует, помечает дом везде как снесенный и что тут ничего нет уже(обертка над указателем).
1
01.03.2014, 23:32

Не по теме:

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

0
01.03.2014, 23:35

Не по теме:

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

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

Не по теме:

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



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

Добавлено через 36 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Если оставаться в рамках темы, то значение указателя в такой обертке меняется ведь не потому что delete начинает себя вести по-другому,
Согласен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.03.2014, 23:41
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru