1

我今天正在处理一个特定于平台的错误,在该错误中,在 Windows 机器上某个字符串会很乱码,但在 Mac 上则不然。std::string该错误与在和之间进行显式和隐式转换的几行有关const char *。基本上,我有一个带有签名的函数

void foo(const std::string &id);

其中 foo 在某些时候打印字符串。在 Windows 上,如果像下面这样调用,它将打印具有各种损坏级别的 id 字符串(前几个字符乱码或与整个字符串一样多)

std::string mystring = bar();
const char *id = mystring.c_str();
foo(id); // pass the C style string in because I thought that's what it took

我通过正确调用纠正了错误foo

std::string mystring = bar();
foo(mystring);

我无法弄清楚一些事情,比如

  • 错误的根源是什么?
  • 为什么它是特定于平台的?
  • const char *和之间的隐式转换std::string是否安全?
4

3 回答 3

4

我将大胆猜测并说您问题中的代码并不代表您的真实代码。foo症状听起来像是内存被重用,这意味着该字符串在调用时不再有效。您可以通过c_str临时使用来获得它,例如const char *id = bar().c_str();.

于 2013-07-18T22:25:30.210 回答
2

有两种可能的可能性,就你所说的,我们无法判断是哪一种:

  1. foo对临时引用的情况处理不当。例如,也许它在某处隐藏了一个指向其参数的指针,而其他代码在foo返回后使用它。

  2. 中的数据mystring包含嵌入的零字节,并且在您调用时长度会丢失c_str

于 2013-07-18T21:48:44.457 回答
0

我不知道发生了什么,但是有什么理由不将 c_str() 的结果复制到您拥有的缓冲区中,对其调用 foo() 并销毁您创建的缓冲区?如果这不能解决它,那只是 foo() 的问题,而不是实现或实现与 foo() 之间的一些冲突。

于 2013-07-18T22:14:38.633 回答