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より優れたメソッドがあります。返品には、よくある間違いの原因となる同じ問題があることに注意してください。そのバッファを使用する場合は、これも保存する必要があります。toLatin1toLocal8bittoUtf8QByteArrayQByteArray

QByteArray array = qstr_test.toUtf8();
const char* p = array.constData();

ここでは、使用する必要があるエンコーディングを明示的に指定するため、この方法の方が優れていると思います。結果は現在の値toStdStringに依存しQTextCodec::codecForCStrings()ます。

于 2013-06-27T13:05:03.657 に答える