Я думаю, что вы смотрите в неправильном направлении. Возможно, у вас есть ошибка, из-за которой вы неправильно инициализируете указатели, слишком рано удаляете объекты и пытаетесь повторно использовать указатель после того, как он был удален или что-то в этом роде. Если это так, вам следует сосредоточиться на определении причины и устранении ошибки, а не пытаться найти способ скрыть ошибку.
В случае подхода, который вы используете с оператором typeid
, ответ заключается в том, что он недействителен. Для объектов типов, которые не содержат виртуальных функций, оператор typeid
разрешается во время компиляции на основе статического типа указателя. Для объектов, которые содержат хотя бы одну виртуальную функцию, она разрешается во время выполнения, но вызов typeid(p)
с недопустимым указателем является неопределенным поведением, и точно так же, как это работает, может произойти сбой.
Использование интеллектуальных указателей, которое было предложено, может зависеть от того, что на самом деле делает библиотека, и от того, можете ли вы всегда обмениваться интеллектуальными указателями или нет. В целом, рекомендуется использовать интеллектуальные указатели для управления памятью, что, в свою очередь, гарантирует правильную инициализацию указателей (исправьте, если проблема заключается в инициализации), а также из-за того, что вы больше не delete
вручную, есть вероятность, что проблема с ранним удалением, которое больше не произойдет. Но учтите, что, хотя это может решить проблему, я все же думаю, что вам нужно понять, почему указатель недопустим в вашем приложении, поскольку это может быть признаком более серьезной проблемы.
Теперь, на первоначальном вопросе о том, как проверить, болтается ли указатель, вы не можете сделать это в программе, но вы можете запустить вашу программу в отладчиках памяти (valgrind в linux, Purify или ряд других в linux), и инструмент сможет помочь вам определить, был ли указатель никогда не инициализирован или вы освободили память для системы перед неправильным использованием.