c ++ stl string <bad ptr> но есть строковое значение, что это значит? - PullRequest
2 голосов
/ 28 июля 2011

У меня есть приложение C ++, которое я устанавливаю простую текстовую строку в std::string, например:

string foo = "my test string";

, но когда я вижу это в отладчике, я получаю следующее:

{_Buf=0x09d55c50 "my test string" _Ptr=0x74736e69 "‹MQhDqrtV‹ר‹VPכ‹URhDqrtP‹ר…uu‹Muƒֱ$טFo" }

или в другой строке я получаю это:

{_Buf=0x09d55c70 "some other string" _Ptr=0x7372614c <Bad Ptr> }

Я вручную набираю его в Visual Studio Express 2008, конечно, я нашел его после какой-то другой библиотеки, которая былаожидая, что эта строка продолжала получать исключения.

Когда я изменил ее на foo="";, все работало нормально.
Функция lib api выглядит следующим образом:

connect(const std::string& hostName, const std::string& userName, const std::string& password) 

(MySQL C ++соединитель)

Мой вопрос: что это за _Ptr, и что более важно, почему я получаю исключения?

ОБНОВЛЕНИЕ
хорошо, это действительно странно, но вещьчто вызывает у меня исключение - это длина строки, только если я установил строку длиной 15 символов, все будет в порядке, но если я установлю длинную строку, исключение будет выброшено.Я использую Visual Studio 2008 Express 32 бит

Ответы [ 4 ]

8 голосов
/ 28 июля 2011

Я думаю, что вы видите «оптимизацию небольших строк», а _Ptr недопустимо (или используется для пробела) для ваших коротких строк.

РЕДАКТИРОВАТЬ: Если вы передаете std::string в другую библиотеку как string, а не char*, тогда вам нужно убедиться, что ваше приложение построено с точно тем же компилятором, версия, опции, оптимизация, настройки отладки и стандартная библиотека как внешняя библиотека была. В противном случае string ABI не будет гарантированно совместим, и вы получите все виды необъяснимых действий.

1 голос
/ 28 июля 2011

Вы строите в режиме отладки? Библиотека, вероятно, настроена на прием строк режима выпуска. Я подозреваю, что вы найдете здание для релиза, которое решит ваши проблемы.

0 голосов
/ 28 июля 2011
Переменная

IMO, _Ptr не должна вызывать беспокойства - это просто тип _Elem, который char для basic_string.Это означает char* - базовая ячейка памяти, не обязательно действительная C-строка.

0 голосов
/ 28 июля 2011

Эти адреса памяти находятся в пространстве ядра. Проверьте, если ваше соглашение о вызовах является неправильным. Было бы полезно, если бы вы могли опубликовать трассировку стека.

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