![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 1 Всего: 23 |
Срабатывает ли деструктор, если приложение завершить вызовом ExitProcess(1) или exit(1)?
Спасибо. |
|||
|
||||
| gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
деструктор срабатывает в момент вызова оператора delete
если хочешь подробнее, то опиши ситуацию деструктор какого объекта, как создавался объект -------------------- С уважением. Gray. |
|||
|
||||
| Конструктор |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 641 Регистрация: 12.5.2004 Где: Москва Репутация: нет Всего: 10 |
По идее не должен, как мне кажется. В случае вызова ExitProcess все мероприятия по освобождению ресурсов берет на себя ОС, она то по идее и вычищает все адресное пространство процесса, а про всякие там дестуркторы и другие приблуды она знать не знает и ведать не ведает. Именно поэтому в книжках настоятельно не рекомендуют вызывать ExitProcess, а использовать стандартные функции завершения из языка.
|
|||
|
||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 1 Всего: 23 |
gray_k
Однажды я описал небольшой класс, затем объявил переменную этого класса без указателей и, соответственно, без оператора new. Очевидно, что оператор delete тоже не использовался. При этом деструктор выдавал себя сообщениями, которые я там прописал. Если у меня есть реализация деструктора, то будет ли она вызвана, если вызвать ExitProcess(1) или exit(1)? Добавлено @ 08:55 Конструктор То есть в данном случае более целесобразно воспользоваться exit, а не ExitProcess? |
|||
|
||||
| Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Стопудово не срабатывает. Деструктор срабатывает только если завершать ретурном и т.д. |
|||
|
||||
| Конструктор |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 641 Регистрация: 12.5.2004 Где: Москва Репутация: нет Всего: 10 |
В этом случае деструктор вызывается автоматически, равно как автоматически вызвался конструктор при создании объекта.
ИМХО да. Хотя чем голову ломать можно просто попытаться отловить обращения к деструкторам прописав в них MessageBox'ы и знать наверняка вызываются они или нет. |
||||
|
|||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 1 Всего: 23 |
Если я правильно всё делал, то функции ExitProcess и exit на самом деле игнорируют деструктор.
|
|||
|
||||
| Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Эти функции не игнорируют деструктор. Они о нём вообще не знают. Деструктор это обычная функция, вызов которой компилятор подставляет в определённых точка - например при выходе из блока или ретурне. И если вызывается ЕхитПроцесс, то прога просто обрывается и не доходит до этих самых точек. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: нет Всего: 64 |
NiJazz При завершении работы процесса, память, насколько я знаю, должна очищаться системой, независимо от того вызваешь ты деструктор или нет
Это сообщение отредактировал(а) <Spawn> - 20.7.2004, 20:00 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 1 Всего: 23 |
<Spawn>
Это так, я знаю. Но просто не хочется расчитывать на систему и лучше самостоятельно обо всём позаботиться. В таком случае, нужно таким образом организовать программу, чтобы функция main вызывала булевы пользовательские функции, а в них уже при критических ситуациях вызывать не exit, а return false. Тогда в main если функция false, то посто return или return 0. Мораль сей басни такова... |
|||
|
||||
| Олег М |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Вот так и пишутся глюкавые программы. Насколько я понимаю каждая программа сама должна корректно освобождать все используемые ресурсы, а не рассчитывать, что кто-то за неё потом эте сделает.
Используй исключительные ситуации. Они для того и сделаны, чтобы деструкторы вовремя вызывались. |
||||
|
|||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: нет Всего: 64 |
Олег М Причем тут глюкавые программы? Если бы система не заботилась о критических завершениях работы программы(К примеру, от TerminateThread, TerminateProcess, которые вызваются TaskManager-ом, в случае необходимости), то ты перезагружался бы каждый час от нехватки неубраной памяти от других процессов.
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
<Spawn> извини, ничего личного.
Но всё таки, программист не должен рассчитывать что система корректно завершит программу. Существует множество моментов, когда она просто физически не может освободить все ресурсы. Например серверы OLE. |
|||
|
||||
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Строуструп, третье издание (Бином-Диалект), стр. 263:
"Если завершение программы осуществляется вызовом стандартной библиотечной функции exit(), то при этом вызываются деструкторы для всех созданных статических объектов." На abort() обрубается. ExitProcess() - системно-зависимая функция, про нее: "ExitProcess is the preferred method of ending a process. This function provides a clean process shutdown." Правда, на деструкторы пользовательских объектов она начхает, по-моему. И вообще: самый первый вопрос поставлен неполно - для локальных объектов ничего не вызовется на exit(), для статических вызовется. Правда, VCLные компоненты надо в динамической памяти размещать... |
|||
|
||||
| Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
А какая вообще нужда вызывать эти функции для своей программы? По моему это плохой стиль. Существует достаточно средств чтобы обойтись без этого.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |