2011-07-28 83 views
2

我有我设置一个简单的文本字符串std::string这样的C++应用程序:C++ stl字符串<bad ptr>但有字符串值是什么意思?

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的我的手打字吧,当然我发现它后,其他一些希望这个字符串的lib保持异常。

当我改变它为foo="";一切工作正常。
的lib API的功能如下:

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

(MySQL的C++连接器)

我的问题是,这是什么_Ptr,更重要的是,为什么我收到异常?

UPDATE
确定它真的很奇怪,但引起我的事情的例外是断弦 只有当我设置15个字符长的字符串它走的好长,但如果我设置更长的字符串异常throwen。即时通讯使用视觉工作室2008年快递32位

+1

请指出问题:是否关于'_Ptr'成员的含义,或者关于您在库中获得的例外情况。在后一种情况下,实际上应该创建一个单独的问题。 – unkulunkulu

+0

当你说“必须导入”时,你的意思是“最重要”吗? –

+0

是的,最抱歉我的错误 – user63898

回答

8

我认为你看到的是“小字符串优化”和_Ptr无效(或它用于空间)为您的短字符串。

编辑:如果你传递std::string到另一个库作为string,而不是一个char*,那么你需要确保你的应用程序是建立与完全相同相同的编译器,版本,选择,优化,调试设置,作为外部库的标准库。否则,ABI不能保证兼容,你会得到各种无法解释的行为。

+0

所以它更好地通过它作为char *? – user63898

1

你在建立调试模式吗?该库可能设置为接受释放模式字符串。我怀疑你会发现发布建设将解决你的问题。

0

这些内存地址似乎在内核空间中。检查你的调用约定是否错误。如果您可以发布堆栈跟踪,这将有所帮助。

+0

内核空间内存与此有什么关系? – Ajay

+0

内核空间与此无关。我在想结构已经变坏了,我猜想是因为调用惯例是错误的。我现在认为这就是Mark B所说的......一种优化 – Mike

0

IMO,_Ptr变量不应该担心 - 这只是_Elem类型,这是charbasic_string。这意味着char* - 一个基本的内存位置,不一定是一个有效的C字符串。

相关问题