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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как вызвать деструктор при ошибке, нужно удалить обьект при зависании 
:(
    Опции темы
asmdzen
Дата 8.12.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

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



В функции main создаются два обьекта, что нужно сделать чтоб при ошибке после создания обьектов - вызывался их деструктор? тоесть такой код:
Код

class myclass{
public:
    ~myclass(){MessageBox(0, "adf", "adf", MB_OK);}
};

int main() 
{
    myclass obj;
    *(char*) 0 = 0;

    return 0;
}

просто выдает ошибку, деструктор для obj не иызывается.
PM MAIL   Вверх
Леопольд
Дата 8.12.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

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



Цитата(asmdzen @  8.12.2010,  20:24 Найти цитируемый пост)
просто выдает ошибку, деструктор для obj не иызывается. 
ОС прерывает выполнение програмы принудительно в тот момент, когда та пытается писать не в свою память. При чём здесь деструкторы? Вот если исключение кинуть, тогда деструктор bудет вызван.


Это сообщение отредактировал(а) Леопольд - 8.12.2010, 20:42


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
asmdzen
Дата 8.12.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

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



проблема в том что при ошибке система выкидывает исключение, в винде я пишу __try и ловлю исключение с __except, но как это сделать для кроссплатформенного случая и как удалить обьекты вручную (вызвать деструктор)? 
PM MAIL   Вверх
asmdzen
Дата 8.12.2010, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(asmdzen @  8.12.2010,  19:55 Найти цитируемый пост)
как это сделать для кроссплатформенного случая

Цитата(asmdzen @  8.12.2010,  20:54 Найти цитируемый пост)
SEH


На всякий случай - это не кроссплатформенно. Кроссплатформенно чужую память не портить smile



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
asmdzen
Дата 11.12.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

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



Но если нельзя предвидеть такие ошибки как деление на ноль или обращение к чужой памяти, как заставить программу закончить работу нормально например на линуксе (на винде и SEH сойдет)?
PM MAIL   Вверх
azesmcar
Дата 11.12.2010, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(asmdzen @  11.12.2010,  12:18 Найти цитируемый пост)
как заставить программу закончить работу нормально 

переносимо - никак, а зачем ей завершаться нормально? какая тебе разница? пиши код так, чтобы таких ошибок не возникало.
PM   Вверх
asmdzen
Дата 11.12.2010, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

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



Ну это и так понятно что такие ошибки нужно обробатывать надлежащим образом, но есть такая ситуациа: имеется програма которая занимается записью файлов на диск, я прикрутил ей кэш для записи файлов, теперь получается что если програма виснет - все данные которые должны были записатся на диск и находились в кэше - теряются. Нужно чтоб при завершении програмы содержание кэша было зброшено на диск, я решил это при помощи обьекта кэша у которого деструктор збрасывает все на диск.
Линукс использует SEH? если нет то как поймать его системные ошибки?
PM MAIL   Вверх
boostcoder
Дата 11.12.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



shared_ptr

Добавлено через 1 минуту и 51 секунду
кстати, любопытно. при такой ошибке:
Цитата(asmdzen @  8.12.2010,  20:24 Найти цитируемый пост)
    myclass obj;
    *(char*) 0 = 0;

смарт-поинтер удалит объект которым владеет?
PM WWW   Вверх
asmdzen
Дата 11.12.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

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



boostcoder,  непонимаю чем shared_ptr может быть лучше моего деструктора, ведь проблема не в том как удалить обьект, а в том как это сделать при системной ошибке. Соответствено деструктор shared_ptr не будет вызван так-же как и любой другой если не будут обрабатыватся системные ошибки.
PM MAIL   Вверх
boostcoder
Дата 11.12.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(asmdzen @  11.12.2010,  13:35 Найти цитируемый пост)
как это сделать при системной ошибке

ну хз... таких ошибок быть не должно. по крайней мере, мне не встречались ситуации приводящие к системной ошибке.
PM WWW   Вверх
asmdzen
Дата 11.12.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

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



самые частые такие ошибки у меня происходили из-за переполнения буфера.
PM MAIL   Вверх
cutwater
Дата 11.12.2010, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

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



Цитата(asmdzen @  11.12.2010,  12:48 Найти цитируемый пост)
самые частые такие ошибки у меня происходили из-за переполнения буфера. 


Дык таких ошибок ВООБЩЕ не должно возникать. Их не нужно корректно обрабатывать, от них нужно избавляться, код покрывать тестами, чтобы таких ситуаций не возникало.


--------------------
user posted image
PM MAIL   Вверх
boostcoder
Дата 11.12.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(asmdzen @  11.12.2010,  13:48 Найти цитируемый пост)
самые частые такие ошибки у меня происходили из-за переполнения буфера.

 smile 

вам нужно что-то почитать по программированию. т.к. сказал cutwater - таких ошибок не должно быть в принципе.
PM WWW   Вверх
maxim1000
Дата 11.12.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(asmdzen @  11.12.2010,  12:53 Найти цитируемый пост)
Ну это и так понятно что такие ошибки нужно обробатывать надлежащим образом, но есть такая ситуациа: имеется програма которая занимается записью файлов на диск, я прикрутил ей кэш для записи файлов, теперь получается что если програма виснет - все данные которые должны были записатся на диск и находились в кэше - теряются. Нужно чтоб при завершении програмы содержание кэша было зброшено на диск, я решил это при помощи обьекта кэша у которого деструктор збрасывает все на диск.

есть более-менее надёжный способ защититься от ошибок части кода - выделить её в отдельный процесс
для работы над одними и теми же данными можно использовать shared memory
в случае ошибок кода в отдельном процессе это можно будет отловить и реашировать соответственно

структура кода получается несколько сложнее, так что использовать стоит только в крайних случаях (например, когда код чужой, исправить его нельзя, а он вредит)


--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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