21 / 13 / 7
Регистрация: 17.10.2015
Сообщений: 126
1

Вызов деструктора

02.04.2016, 15:50. Показов 3319. Ответов 3
Метки нет (Все метки)

Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2016, 15:50
Ответы с готовыми решениями:

Вызов деструктора
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки....

Вызов деструктора
Здравствуйте ,подскажите пожалуйста ,есть вот такой код ... При создании объекта MyClass в...

Вызов деструктора
Есть написанный мною код: #include <iostream> class Foo { private: int *key; public: Foo...

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

3
2 / 2 / 0
Регистрация: 23.03.2016
Сообщений: 39
02.04.2016, 15:52 2
Система сама освобождает память, выделенную приложению.
1
Эксперт С++
8719 / 4299 / 958
Регистрация: 15.11.2014
Сообщений: 9,744
02.04.2016, 16:49 3
Цитата Сообщение от Гайфи Посмотреть сообщение
Вызывается ли деструктор объекта при завершении программы?
только для статических, и автоматических объектов.

Цитата Сообщение от Гайфи Посмотреть сообщение
а при аварийном завершении?
в общем случае нет.

в случае аварии приложение находится в нестабильном состоянии.
в этом состоянии никто ничего уже не гарантирует.

Цитата Сообщение от Гайфи Посмотреть сообщение
А если снять процесс приложения диспетчером?
аналогично аварийному завершению.

с той лишь разницей, что это может быть сигнал смерти,
который в принципе нельзя обработать изнутри приложения.
в этом случае приложение вообще ничего не сможет сделать.
1
Вездепух
Эксперт CЭксперт С++
10427 / 5697 / 1552
Регистрация: 18.10.2014
Сообщений: 14,059
03.04.2016, 05:53 4
Лучший ответ Сообщение было отмечено Гайфи как решение

Решение

Цитата Сообщение от Гайфи Посмотреть сообщение
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении?
Зависит от того, что это за объект, что это за завершение и даже немножко от реализации.

1. Нормальное завершение - выход из main по return или достижение конца main - натуральным образом вызовет деструкторы всех автоматических объектов, чье время жизни уже началось, ибо выход из функции (из блока) вызывает такие деструкторы. Также такое завершение вызовет деструкторы всех статических объектов, чье время жизни уже началось. (Для определения того, какие статические объекты надо деструктировать, а какие нет, во время выполнения строятся соотв. внутренние структуры данных).

2. Завершение по std::exit не вызывает деструкторы автоматических объектов. Однако завершение по std::exit вызовет деструкторы всех статических объектов, чье время жизни уже началось.

3. Завершение по std::abort или std::terminate не вызывает деструкторов.

4. Завершение по непойманному исключению - это фактически завешение по std::terminate. Однако выполняется ли раскрутка стека перед вызовом std::terminate - определяется реализацией, т.е. будут ли вызваны деструкторы автоматических объектов - зависит от компилятора.

5. Также не стоит забывать, что в наше время в С++ есть еще один вид storage duration - объекты потоков (thread storage duration). Упрощенно можно считать, что вышесказанное применимо к объектам потоков, считая что их поток-хозяин - это своя отдельная внутренняя "программа" в рамках вашей программы, а объекты потоков - это "статические" объекты в ней. Соответствующая функция потока - это аналог функции main в этой внутренней "программе".

Однако std::exit в потоке вызывает деструкторы объектов этого потока, деструкторы статических объектов программы и завершает всю программу, а не только этот поток.

Внешние по отношению к некоторому потоку события, вызывающие завершение всей программы, не вызывают вызова деструкторов объектов этого потока.

6. Аварийное завершение как проявление неопределенного поведения, понятное дело, в рамках языка никакого вызова деструкторов не делает.

Деструкторы динамических объектов автоматически не вызываются. Их автоматическая деструкция может быть выполнена опосредовано - делегирована через деструкцию автоматических и статических объектов.

Ну и конечно же подразумевается, что идея "вызова деструктора", применима только к объектам у которых есть деструктор. Более того, этот деструктор должен быть нетривиальным для того, чтобы о нем был смысл разговаривать.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2016, 05:53
Помогаю со студенческими работами здесь

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

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

Не понятный вызов деструктора
Здравствуйте. Ситуация такая, есть класс MyClass к примеру, и при таком коде: //разные инклюды...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru