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

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

Войти
Регистрация
Восстановить пароль
 
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
#1

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

01.01.2013, 23:15. Просмотров 903. Ответов 10
Метки нет (Все метки)

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

Повторный вызов деструктора для объекта - C++
Здравствуйте! К сожалению, я пока не умею пользоваться отладчиком для анализа работы программ, поэтому в очередной раз обращаюсь к вам...

Исключительные ситуации (повторный вызов деструктора) - C++
Всем привет ! Подскажите пожалуйста , почему повторно вызываются деструкторы класса A,B,C? #include <stdio.h> #include...

Вызов деструктора - C++
Есть написанный мною код: #include <iostream> class Foo { private: int *key; public: Foo (const int a=0) { key = new int...

Вызов деструктора - C++
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки. s1.~Shave(); И я не уверен, что так...

Вызов деструктора - C++
При ручном вызове деструктора, освобождается ли память*

Вызов деструктора - C++
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?

10
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
01.01.2013, 23:25 #2
так а удаление то не производится при его вызове.
К тому же, зачем явно вызывать деструктор?
0
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
01.01.2013, 23:31  [ТС] #3
Kuzia domovenok, явный вызов деструктора конечно нежелателен, но вполне себе применим при каком-нибудь хитроумном управление объектами.

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

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

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

Добавлено через 8 минут
Тут я погорячился, во время деструктора ещё можно дёргать объект. Но только внутри самого деструктора, а не из параллельного потока, например. И если это виртуальная функция, то под честное слово, что она не будет лезть в ту часть, которая уже убита предыдущими деструкторами классов-родителей.
1
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
02.01.2013, 00:31  [ТС] #9
Таки я не совсем дегенерат, спасибо за ссылку на стандарт.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
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
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
02.01.2013, 10:24 #11
В некоторых исключительных случаях вызов деструктора руками имеет смысл. Например вот пример из стандарта.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2013, 10:24
Привет! Вот еще темы с ответами:

Явный вызов деструктора - C++
Добрый вечер всем! Я раньше читал статью о деструкторах, и там говорилось что можно явно вызвать деструктор. Статью я прочитал и забыл) И...

Двойной вызов деструктора - C++
Здравствуйте, уважаемые. Вот столкнулся с такой проблемой... CharRow - это класс, который содержит указатель на строку... ...

Явный вызов деструктора - C++
Есть класс Person, с полями string,string,long. Исходные данные хранятся в файле. Нужно сделать вектор объектов этого класса. ...

Не понятный вызов деструктора - C++
Здравствуйте. Ситуация такая, есть класс MyClass к примеру, и при таком коде: //разные инклюды MyClass var; int WinMain(...) { ...


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
02.01.2013, 10:24
Ответ Создать тему
Опции темы

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