21 / 13 / 7
Регистрация: 17.10.2015
Сообщений: 126
|
|
1 | |
Вызов деструктора02.04.2016, 15:50. Показов 3319. Ответов 3
Метки нет Все метки)
(
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
02.04.2016, 15:50 | |
Ответы с готовыми решениями:
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
|
Вездепух
![]() ![]() 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
|
03.04.2016, 05:53 | |
Помогаю со студенческими работами здесь
4
Двойной вызов деструктора Не понятный вызов деструктора Явный вызов деструктора Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |