Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деструктор 
:(
    Опции темы
NiJazz
Дата 20.7.2004, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Срабатывает ли деструктор, если приложение завершить вызовом ExitProcess(1) или exit(1)?
Спасибо.
PM MAIL   Вверх
gray_k
Дата 20.7.2004, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



деструктор срабатывает в момент вызова оператора delete
если хочешь подробнее, то опиши ситуацию
деструктор какого объекта, как создавался объект


--------------------
С уважением.
Gray.
PM MAIL   Вверх
Конструктор
Дата 20.7.2004, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 641
Регистрация: 12.5.2004
Где: Москва

Репутация: нет
Всего: 10



По идее не должен, как мне кажется. В случае вызова ExitProcess все мероприятия по освобождению ресурсов берет на себя ОС, она то по идее и вычищает все адресное пространство процесса, а про всякие там дестуркторы и другие приблуды она знать не знает и ведать не ведает. Именно поэтому в книжках настоятельно не рекомендуют вызывать ExitProcess, а использовать стандартные функции завершения из языка.
PM MAIL WWW ICQ   Вверх
NiJazz
Дата 20.7.2004, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



gray_k
Цитата
деструктор срабатывает в момент вызова оператора delete

Однажды я описал небольшой класс, затем объявил переменную этого класса без указателей и, соответственно, без оператора new. Очевидно, что оператор delete тоже не использовался. При этом деструктор выдавал себя сообщениями, которые я там прописал.
Если у меня есть реализация деструктора, то будет ли она вызвана, если вызвать ExitProcess(1) или exit(1)?
Добавлено @ 08:55
Конструктор
То есть в данном случае более целесобразно воспользоваться exit, а не ExitProcess?
PM MAIL   Вверх
Олег М
Дата 20.7.2004, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата
Срабатывает ли деструктор, если приложение завершить вызовом ExitProcess(1) или exit(1)?

Стопудово не срабатывает.
Деструктор срабатывает только если завершать ретурном и т.д.
PM MAIL ICQ   Вверх
Конструктор
Дата 20.7.2004, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 641
Регистрация: 12.5.2004
Где: Москва

Репутация: нет
Всего: 10



Цитата
Очевидно, что оператор delete тоже не использовался. При этом деструктор выдавал себя сообщениями, которые я там прописал.


В этом случае деструктор вызывается автоматически, равно как автоматически вызвался конструктор при создании объекта.

Цитата
То есть в данном случае более целесобразно воспользоваться exit, а не ExitProcess?


ИМХО да. Хотя чем голову ломать можно просто попытаться отловить обращения к деструкторам прописав в них MessageBox'ы и знать наверняка вызываются они или нет.
PM MAIL WWW ICQ   Вверх
NiJazz
Дата 20.7.2004, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Если я правильно всё делал, то функции ExitProcess и exit на самом деле игнорируют деструктор.
PM MAIL   Вверх
Олег М
Дата 20.7.2004, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата
ExitProcess и exit на самом деле игнорируют деструктор

Эти функции не игнорируют деструктор. Они о нём вообще не знают. Деструктор это обычная функция, вызов которой компилятор подставляет в определённых точка - например при выходе из блока или ретурне.
И если вызывается ЕхитПроцесс, то прога просто обрывается и не доходит до этих самых точек.
PM MAIL ICQ   Вверх
<Spawn>
Дата 20.7.2004, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



NiJazz При завершении работы процесса, память, насколько я знаю, должна очищаться системой, независимо от того вызваешь ты деструктор или нет

Это сообщение отредактировал(а) <Spawn> - 20.7.2004, 20:00


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
NiJazz
Дата 21.7.2004, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



<Spawn>
Цитата
При завершении работы процесса, память, насколько я знаю, должна очищаться системой, независимо от того вызваешь ты деструктор или нет

Это так, я знаю. Но просто не хочется расчитывать на систему и лучше самостоятельно обо всём позаботиться.
В таком случае, нужно таким образом организовать программу, чтобы функция main вызывала булевы пользовательские функции, а в них уже при критических ситуациях вызывать не exit, а return false. Тогда в main если функция false, то посто return или return 0.
Мораль сей басни такова...
PM MAIL   Вверх
Олег М
Дата 21.7.2004, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата
При завершении работы процесса, память, насколько я знаю, должна очищаться системой, независимо от того вызваешь ты деструктор или нет

Вот так и пишутся глюкавые программы.
Насколько я понимаю каждая программа сама должна корректно освобождать все используемые ресурсы, а не рассчитывать, что кто-то за неё потом эте сделает.


Цитата
таком случае, нужно таким образом организовать программу, чтобы функция main вызывала булевы

Используй исключительные ситуации. Они для того и сделаны, чтобы деструкторы вовремя вызывались.
PM MAIL ICQ   Вверх
<Spawn>
Дата 21.7.2004, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



Олег М Причем тут глюкавые программы? Если бы система не заботилась о критических завершениях работы программы(К примеру, от TerminateThread, TerminateProcess, которые вызваются TaskManager-ом, в случае необходимости), то ты перезагружался бы каждый час от нехватки неубраной памяти от других процессов.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Олег М
Дата 21.7.2004, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



<Spawn> извини, ничего личного.
Но всё таки, программист не должен рассчитывать что система корректно завершит программу. Существует множество моментов, когда она просто физически не может освободить все ресурсы. Например серверы OLE.

PM MAIL ICQ   Вверх
Hroft
Дата 21.7.2004, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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ные компоненты надо в динамической памяти размещать...
PM MAIL ICQ   Вверх
Олег М
Дата 21.7.2004, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



А какая вообще нужда вызывать эти функции для своей программы? По моему это плохой стиль. Существует достаточно средств чтобы обойтись без этого.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.