1

下面是一些测试代码:

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空的?

4

1 回答 1

5

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()当前值。

于 2013-06-27T13:05:03.657 回答