В общем, это просто невозможно из C ++, так как указатели слишком «сырые». Кроме того, проверка того, что вы были размещены позже, чем указанный класс, не сработает, потому что, если вы измените строку, указатель c_str вполне может измениться.
В этом конкретном случае вы можете проверить, возвращает ли строка то же значение для c_str. Если это так, вы, вероятно, все еще действительны, а если нет, то у вас есть недопустимый указатель.
В качестве инструмента отладки я бы посоветовал использовать усовершенствованную систему отслеживания памяти, такую как valgrind (боюсь, она доступна только для Linux. Подобные программы существуют для Windows, но я считаю, что все они стоят денег. Эта программа - единственная причина, по которой я на моем Mac установлен linux). За счет гораздо более медленного выполнения вашей программы valgrind обнаруживает, читали ли вы когда-нибудь недопустимый указатель. Хотя он не идеален, я обнаружил, что он обнаруживает много ошибок, в частности, такого типа.