这是一些测试代码:
QString qstr_test("TEST");
const char *p = qstr_test.toStdString().c_str();
cout << p << endl;
没有输出,因为p是空字符串。
这是我在调试时得到的:
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::c_str
returns: 0x003bf9d4 "TEST"
p : 0x003bf9d4 ""
似乎p
指向正确的位置但未显示正确的内容。
为什么p
为空?
答案 0 :(得分:4)
std::string
对象是临时的,并在c_str()
完成后立即销毁。但std::string
拥有char*
返回的c_str()
缓冲区,此缓冲区也被销毁。所以你的代码是不正确和危险的。只要您使用std::string
缓冲区
char*
std::string s = qstr_test.toStdString();
const char* p = s.c_str();
创建std::string
只是为了将其转换为char*
似乎毫无意义。 QString
有更好的方法:toLatin1
,toLocal8bit
和toUtf8
。请注意,返回的QByteArray
具有相同的问题,这是常见的错误来源。如果你想使用它的缓冲区,也必须存储QByteArray
。
QByteArray array = qstr_test.toUtf8();
const char* p = array.constData();
我认为这种方法更好,因为在这里你明确指定了你需要使用的编码。 toStdString
结果取决于QTextCodec::codecForCStrings()
当前值。