![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
В функции main создаются два обьекта, что нужно сделать чтоб при ошибке после создания обьектов - вызывался их деструктор? тоесть такой код:
просто выдает ошибку, деструктор для obj не иызывается. |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
ОС прерывает выполнение програмы принудительно в тот момент, когда та пытается писать не в свою память. При чём здесь деструкторы? Вот если исключение кинуть, тогда деструктор bудет вызван.
Это сообщение отредактировал(а) Леопольд - 8.12.2010, 20:42 -------------------- вопросов больше чем ответов |
|||
|
||||
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
проблема в том что при ошибке система выкидывает исключение, в винде я пишу __try и ловлю исключение с __except, но как это сделать для кроссплатформенного случая и как удалить обьекты вручную (вызвать деструктор)?
|
|||
|
||||
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
Нашел, нужно было включить флаг компилятора, мапирующий SEH на C++ exceptions.
в MSVS-2008 это Project->properties->C/C++->Code generation->Enable c++ exceptions поставить Yes with SEH exceptions (/EHa) |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
На всякий случай - это не кроссплатформенно. Кроссплатформенно чужую память не портить ![]() |
|||
|
||||
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
Но если нельзя предвидеть такие ошибки как деление на ноль или обращение к чужой памяти, как заставить программу закончить работу нормально например на линуксе (на винде и SEH сойдет)?
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
Ну это и так понятно что такие ошибки нужно обробатывать надлежащим образом, но есть такая ситуациа: имеется програма которая занимается записью файлов на диск, я прикрутил ей кэш для записи файлов, теперь получается что если програма виснет - все данные которые должны были записатся на диск и находились в кэше - теряются. Нужно чтоб при завершении програмы содержание кэша было зброшено на диск, я решил это при помощи обьекта кэша у которого деструктор збрасывает все на диск.
Линукс использует SEH? если нет то как поймать его системные ошибки? |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
shared_ptr
Добавлено через 1 минуту и 51 секунду кстати, любопытно. при такой ошибке: смарт-поинтер удалит объект которым владеет? |
|||
|
||||
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
boostcoder, непонимаю чем shared_ptr может быть лучше моего деструктора, ведь проблема не в том как удалить обьект, а в том как это сделать при системной ошибке. Соответствено деструктор shared_ptr не будет вызван так-же как и любой другой если не будут обрабатыватся системные ошибки.
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
ну хз... таких ошибок быть не должно. по крайней мере, мне не встречались ситуации приводящие к системной ошибке. |
|||
|
||||
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
самые частые такие ошибки у меня происходили из-за переполнения буфера.
|
|||
|
||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 2 Всего: 10 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 1 Всего: 110 |
есть более-менее надёжный способ защититься от ошибок части кода - выделить её в отдельный процесс для работы над одними и теми же данными можно использовать shared memory в случае ошибок кода в отдельном процессе это можно будет отловить и реашировать соответственно структура кода получается несколько сложнее, так что использовать стоит только в крайних случаях (например, когда код чужой, исправить его нельзя, а он вредит) -------------------- qqq |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |