我今天正在处理一个特定于平台的错误,在这个错误中,在 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
之间的隐式转换是否安全?
最佳答案
我要大胆猜测一下,你问题中的代码并不代表你的真实代码。症状听起来像是内存被重用,这意味着字符串在 foo
调用时不再有效。您可以通过在临时对象上使用 c_str
来获得它,例如 const char *id = bar().c_str();
。
关于c++ - C 字符串和 std::string 之间的转换导致平台特定方式出现乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17734361/