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

Мне хорошо известно об уродстве этого вопроса, я все равно хотел бы узнать, возможно ли это:

Когда программа пытается прочитать/записать недопустимый указатель (NULL, нераспределенный блок и т.д.), окна сбой приложения с нарушением нарушения доступа.

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

Ответы

Ответ 1

Лучшая ставка, если вы должны использовать необработанные указатели, состоит в том, чтобы убедиться, что это либо действительный указатель, либо NULL. Затем вы можете проверить, действительно ли это, если он равен NULL.

Но чтобы ответить на ваш вопрос, вы можете поймать такие вещи с помощью структурированной обработки исключений (SEH).

Как говорится, SEH - плохая идея.

Ответ 2

Улавливание подобных ошибок устраняет симптомы, а не основную причину.

Следующие идиомы будут работать на любой платформе:

  • инициализировать все указатели до нуля

  • если вы не можете гарантировать, что указатель действителен, убедитесь, что он не равен 0, прежде чем указывать его

  • при удалении объектов, установите указатель на 0 после удаления

  • Будьте осторожны с проблемами владения объектами при передаче указателей на другие функции

Ответ 3

Существуют функции IsBadReadPtr и IsBadWritePtr, которые могут делать то, что вы хотите. Существует также статья, которая объясняет, почему вы не должны их использовать.

Ответ 4

Вы можете проверить, является ли указатель NULL!

if ( ptr == NULL ) {
   // don't use it
}

Это единственный переносимый тест, который вы можете сделать. Windows предоставляет различные API для тестирования указателей, но, как указывали другие, использование их может быть проблематичным.

Ответ 7

Я не знаю о Windows, но в * nix вы можете установить обработчик сигнала SIGSEGV для перехвата исключения.