Как проверить правильность указателя?
Я хорошо знаю об уродливости этого вопроса, я все же хотел бы знать, возможно ли это:
Когда программа пытается прочитать / записать недопустимый указатель (NULL, невыделенный блок и т. Д.), Происходит сбой приложения с исключением нарушения прав доступа.
Вопрос в том, есть ли способ проверить, будет ли указатель генерировать исключение, прежде чем пытаться его использовать, или же есть способ перехватить это исключение?
7 ответов
Лучше всего, если вы должны использовать необработанные указатели, чтобы убедиться, что это действительный указатель или NULL. Затем вы можете проверить, является ли он действительным, проверив, равно ли оно NULL.
Но чтобы ответить на ваш вопрос, вы можете поймать подобные вещи с помощью структурированной обработки исключений (SEH).
При этом SEH - плохая идея.
Выявление такого рода ошибок направлено на устранение симптомов, а не на их основную причину.
Следующие идиомы будут работать на любой платформе:
инициализировать все указатели на ноль
если вы не можете гарантировать, что указатель действителен, проверьте, что он не равен 0, прежде чем косвенно указывать
при удалении объектов установите указатель на 0 после удаления
будьте осторожны с вопросами владения объектами при передаче указателей на другие функции
Есть функции IsBadReadPtr
а также IsBadWritePtr
это может делать то, что вы хотите. Есть также статья, которая объясняет, почему вы не должны их использовать.
Вы, конечно, можете проверить, является ли указатель NULL!
if ( ptr == NULL ) {
// don't use it
}
Это единственный портативный тест, который вы можете сделать. Windows действительно предоставляет различные API для тестирования указателей, но, как отмечали другие, их использование может быть проблематичным.
Я думаю, что вы ищете что-то вроде IsBadReadPtr.
Документация:
http://msdn.microsoft.com/en-us/library/aa366713(VS.85).aspx
Я не знаю о Windows, но в *nix вы могли бы установить обработчик сигнала SIGSEGV, чтобы перехватить исключение.