Как я могу определить, указывает ли const char * на правильную строку? - PullRequest
0 голосов
/ 07 сентября 2010
std::string str = "string":
const char* cstr = str.c_str();
str.clear();
//here, check if cstr points to a string literal.

Как проверить, указывает ли cstr на строку при запуске программы в режиме отладки или выпуска?

Есть ли способ определить это с помощью обработки исключений в C ++?

Ответы [ 3 ]

6 голосов
/ 07 сентября 2010

Нет портативного способа сделать это. Реализация совершенно свободна для хранения в буфере без изменений после вызова clear(). Если OTOH, clear() освобождает буфер строки, cstr теперь указывает на нераспределенную память, но даже в этом случае это зависит от того, как распределитель памяти обрабатывает это. Распределитель отладки заполнит блок некоторым магическим числом, например 0xDEADBEEF, а рабочий распределитель может оставить его без изменений или вернуть всю страницу обратно в ОС.

Каким бы способом вы его не вырезали, использование указателя, возвращенного c_str() после того, как строка была изменена, является неопределенным поведением. Конец истории.

2 голосов
/ 07 сентября 2010

Вы не можете.

Указатель, возвращаемый str.c_str(), не гарантируется как действительный в любом случае после изменения нижней строки.

Например, вы можете найти там строку, или найти там ноль, или выбросить ошибку нарушения доступа.

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

1 голос
/ 07 сентября 2010

Нет необходимости что-либо проверять.По определению это не так.Результат c_str() недопустим, если строка каким-либо образом изменена.Возможно, использование его один раз не приведет к сбою, но в следующий раз может.Сбои гарантируются редко.

Если вы хотите продолжить работу с литералом (который конкретно относится к неизменяемой строке в кавычках, "string" здесь), назначьте ее отдельной переменной.1006 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...