Название: Как отловить ошибку сегментации на программном уровне? Отправлено: 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 Я тоже горел идеей отлавливать эти ошибки (как и каждый, кто с ними сталкивался, думаю). Но под конец ничего лучше, как "сделать дамп", закрыть программу, выдать предупреждение не нашёл.
|