Подтвердить что ты не робот

Попробуйте/Поймайте ошибку сегментации в Linux

У меня есть приложение на Linux С++, и я хотел бы протестировать указатель на объект до его разглашения. Однако try/catch не работает для этого в Linux из-за ошибки сегментации. Как это можно сделать?

4b9b3361

Ответ 1

Если у вас есть сценарий, в котором многие указатели на вашем приложении ссылаются на те же объекты с ограниченным сроком жизни, популярным решением является использование повышение интеллектуальных указателей. Изменить: в С++ 11 оба этих типа доступны в стандартной библиотеке

Вы хотите использовать shared_ptr для указателей (ов), которые отвечают за время жизни вашего объекта и weak_ptr для других указателей, которые могут стать недействительными. Вы увидите, что weak_ptr имеет проверку действительности, которую вы запрашиваете для встроенного.

Ответ 2

Ошибка сегментации не является исключением (например, исключение Java NullPointerException); это сигнал, отправленный из ОС в этот процесс. Посмотрите справочную страницу для sigaction для указателей о том, как установить обработчик для ошибки сегментации (SIGSEGV).

Ответ 3

Инициализируйте указатель на NULL. Если после некоторой обработки он по-прежнему остается NULL, его значение недействительно, в противном случае оно действительное.

Ответ 4

Вы можете включить обработчик сигналов для SIGSEGV для этого одного случая. Для получения дополнительной информации см. "Сигнал" справочной страницы. Другой альтернативой является использование ссылок, которые гарантированно действительны. Это зависит от вашего применения, конечно.

Ответ 5

Нет естественного, универсального способа с необработанными указателями С++. С++ предполагает, что вы будете отслеживать эту информацию.

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

Ответ 6

Как вы проверяете указатель на достоверность? Сравнить с NULL?

Лучшее, что вы делаете, - запустить свою программу под Valgrind. Ошибка может быть в другом месте.

Обновление: на платформе Win32 есть что-то вроде __try __except, что позволяет обнаруживать некоторые исключения. Насколько я знаю, для этой функции Win32 нет эквивалента Linux.

Ответ 7

Если вы прикрепляете обработчик к SIGSEGV, вы можете сделать не так много, кроме журнала, что ошибка произошла и изящно закончилась. Ваша программа находится в состоянии undefined, когда это нарушение происходит, и поэтому может быть небезопасно продолжать нормальную работу.

Помимо проверки на NULL, я не верю, что есть способ проверить, является ли указатель "действительным" в том смысле, который вы описываете. Во время нормальной работы такие ошибки не должны происходить, поскольку они представляют собой ошибку, поэтому вам нужно, чтобы ваша программа терпела неудачу, хотя и изящно.

Ответ 8

Указатели хранятся в объектах. Они инициализируются в конструкторе, возможно, до 0 (NULL). Они удаляются в деструкторе, возможно, в задании и редко в других функциях. При удалении в членах, отличных от деструктора, им сразу присваивается новое значение или 0.

Ответ 9

Как правило, в отношении довольно странной идеи "проверки указателя не-NULL для достоверности" ознакомьтесь с этой статьей: http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx ( "IsBadXxxPtr действительно нужно называть CrashProgramRandomly" )