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

Повторный вызов деструктора - C++

Восстановить пароль Регистрация
 
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
01.01.2013, 23:15     Повторный вызов деструктора #1
C++
1
2
3
4
{
    bar b;
    b.~bar();
}
В данном примере деструктор bar вызовется дважды.
Как у уже удаленного объекта может вызываться деструктор и почему не происходит ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.01.2013, 23:15     Повторный вызов деструктора
Посмотрите здесь:

Вызов деструктора C++
C++ Вызов деструктора
C++ Повторный вызов процедуры
C++ Явный вызов деструктора
Вызов деструктора C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.01.2013, 23:25     Повторный вызов деструктора #2
так а удаление то не производится при его вызове.
К тому же, зачем явно вызывать деструктор?
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
01.01.2013, 23:31  [ТС]     Повторный вызов деструктора #3
Kuzia domovenok, явный вызов деструктора конечно нежелателен, но вполне себе применим при каком-нибудь хитроумном управление объектами.

А почему объект не удаляется при явном вызове? Чем он отличается от неявного?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.01.2013, 23:34     Повторный вызов деструктора #4
так деструктор не для удаления объекта предназначен, а для проведения каких-либо операций деинициализации перед удалением объекта.
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
01.01.2013, 23:38  [ТС]     Повторный вызов деструктора #5
Kuzia domovenok, омг, те после выполнения деструктора не происходит обязательное физического удаления объекта из памяти... Моя жизнь никогда не будет прежней. Я дегенерат, узнаю об этом только сейчас.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.01.2013, 23:50     Повторный вызов деструктора #6
Ну, вообще строго говоря, повторный вызов деструктора — это undefined behavior (12.4/14). Время жизни объекта заканчивается в начале вызова деструктора и это необратимо.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.01.2013, 23:53     Повторный вызов деструктора #7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ну, вообще строго говоря, повторный вызов деструктора — это undefined behavior (12.4/14). Время жизни объекта заканчивается в начале вызова деструктора и это необратимо.
А можно поподробнее. Что выполняет деструктор, помимо действий заданных в его теле?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
02.01.2013, 00:08     Повторный вызов деструктора #8
Ничего. Возврат памяти системе — головная боль реализации. Её выделение неявное: это проблемы new и delete, где её взять и как вернуть. auto-объектов, которые (обычно) создаются на стеке, это тоже касается — это проблемы рантайма, как он там шаманит со стеком и кто и когда будет дёргать указатель на верхушку стека.

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

Но с точки зрения спецификации объекта уже нет, когда начался вызов деструктора. Его работа — это действительно деинициализация объекта. И как только он начал это делать, объект уже нельзя использовать, потому что он "в процессе разбора/разобран". Нельзя вызвать деструктор повторно. Нельзя даже вызывать методы этого объекта (даже в деструкторе). Это как с выделением памяти — то, что объект ещё остался в памяти сразу после вызова delete, не гарантирует, что его можно спокойно продолжать использовать.

Добавлено через 8 минут
Тут я погорячился, во время деструктора ещё можно дёргать объект. Но только внутри самого деструктора, а не из параллельного потока, например. И если это виртуальная функция, то под честное слово, что она не будет лезть в ту часть, которая уже убита предыдущими деструкторами классов-родителей.
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
02.01.2013, 00:31  [ТС]     Повторный вызов деструктора #9
Таки я не совсем дегенерат, спасибо за ссылку на стандарт.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
02.01.2013, 01:54     Повторный вызов деструктора #10
конкретно про b.~bar(); пункт 5.1
http://www.cyberforum.ru/blogs/18334/blog103.html

Вообще совет: ну его на фиг ставить так вопросы: "почему не работает такой ЗАВЕДОМО неправильный код". Оно, конечно, интересно и познавательно. И даже где-то интереснее, чем разбирать правильные. Только вот ведь какая загогулина, понимаешь, неправильных- бесконечность их все разбирать жизни не хватит.

Касаемо даже вызова деструктора. Сказано явно не вызывать- значит, не вызывать. Мало ли что там компилятор хавает!

Добавлено через 6 минут
тут разруливали за деструкторы
http://www.cyberforum.ru/faq/thread1...ml#post1624482
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2013, 10:24     Повторный вызов деструктора
Еще ссылки по теме:

C++ Повторный вызов конструктора?!
Повторный вызов деструктора для объекта C++
Исключительные ситуации (повторный вызов деструктора) C++

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
02.01.2013, 10:24     Повторный вызов деструктора #11
В некоторых исключительных случаях вызов деструктора руками имеет смысл. Например вот пример из стандарта.
Yandex
Объявления
02.01.2013, 10:24     Повторный вызов деструктора
Ответ Создать тему
Опции темы

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