Russian Qt Forum

Программирование => С/C++ => Тема начата: yarick от Ноябрь 25, 2012, 08:38



Название: Как отловить ошибку сегментации на программном уровне?
Отправлено: yarick от Ноябрь 25, 2012, 08:38
В программе довольно часто возникают ошибки типа null pointer... как их отловить, чтобы сохранить данные? Или возможно обработать. Допустим если у меня несколько QMainWindows - не закрывать же все если только в одном ошибка произошла

Проверка на равенство NULL - это часный случай. Обычно бывает так что указатель не равен NULL и указывает на участок в памяти, который был освобождён. Как проверить указатель на валидность перед обращением?


Название: Re: Как отловить ошибку сегментации на программном уровне?
Отправлено: Igors от Ноябрь 25, 2012, 10:24
- не закрывать же все если только в одном ошибка произошла
Это не столь очевидно. Многие (в том числе и я) придерживаются мнения что фатальные ошибки отлову и обработке не подлежат - их надо исправлять. А если оптимизма много, то в разделе "кладовая" был пост как ловить, найдете.

Проверка на равенство NULL - это часный случай. Обычно бывает так что указатель не равен NULL и указывает на участок в памяти, который был освобождён. Как проверить указатель на валидность перед обращением?
Знову за рибу грошi  :'(  В языке C/C++ таких средств нет (и это правильно)


Название: Re: Как отловить ошибку сегментации на программном уровне?
Отправлено: Akon от Ноябрь 25, 2012, 10:48
Цитировать
Проверка на равенство NULL - это часный случай. Обычно бывает так что указатель не равен NULL и указывает на участок в памяти, который был освобождён. Как проверить указатель на валидность перед обращением?
Это никак полностью не проверишь. Можно использовать нативный механизм ОС для проверки допустимости обращения к памяти (например, под Win использовать SEH и ловить Access Violation), но так указатель может быть кривым и указывать на валидную память.


Название: Re: Как отловить ошибку сегментации на программном уровне?
Отправлено: Bepec от Ноябрь 25, 2012, 12:22
Я тоже горел идеей отлавливать эти ошибки (как и каждый, кто с ними сталкивался, думаю). Но под конец ничего лучше, как "сделать дамп", закрыть программу, выдать предупреждение не нашёл.