- ベストアンサー
Qtの文字列変換について
- C++言語でQtを使用して文字列変換を行う際に、同じコードでも異なる結果が得られる問題が発生しています。
- 特に、QVariantMapを使用して文字列を取得する場合に、toLocal8Bit()関数を使用すると、一部の変数で正しい結果が得られず、初期値のままとなってしまいます。
- この問題の原因は、文字列の変換手順にある可能性があります。適切な変換手順を使用することで、問題を解決できる可能性があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわ。 >その手前のQStringからQByteArrayへの変換時(toLocal8Bit()実行時)、QStringの一時オブジェクトは同じように開放されないのでしょうか? >失敗しているのであれば、hoge1のパターンも変換失敗となりそうな気がしています。 はい、QStringの一時オブジェクトは開放されます。 toLocal8Bitの関数内部でQByteArrayが生成され返されますが、QByteArrayのコンストラクタで内部に別の配列を作成し、文字列自体をコピーしているのだと思います。 (= QString内部の配列とQByteArray内部の配列は別物 = QStringが開放されてもQByteArrayは無関係) また、参考URLのコンストラクの説明に"QByteArray makes a deep copy of the string data"とありますので、"deep copy"などのキーワードで検索されるとまた宜しいかと思います。 長々と説明が上手くできず申し訳ないのですが・・・、コードでなら以下のように確認できると思います。 -- QString* hoge = new QString("hoge"); QByteArray hogehoge = hoge->toLocal8Bit(); delete hoge; printf("%s\n", hogehoge.data()); ★QByteArray内部の別の配列に文字列がコピーされているので、hogeが解放されても表示されるはず
その他の回答 (1)
- heburusu
- ベストアンサー率85% (140/164)
data()でQByteArray が内部に持つポインタがhoge2に渡されますが、 その直後にQByteArrayのデストラクタが実行され、そのポインタが無効なアドレスを指しているために内容が異なっているのではないかと思います。 説明がわかりにくいかもしれませんので、わかりやすく下記と以下のような感じで挙動がことなっている状態です。 参考URLの"一時オブジェクト"に関する記事を読んで頂くとより理解いただけるかと思います。 ■hoge1 QByteArray* hogehoge = new QByteArray(); char* hoge1 = hogehoge ->data(); printf("%s\n", hoge1); ■hoge2 QByteArray* hogehoge = new QByteArray(); char* hoge2 = hogehoge ->data(); delete hogehoge; ★ここでhoge2は無効なアドレスとなる printf("%s\n", hoge2);
補足
heburusu様 丁寧なご回答感謝いたします。 とてもわかりやすいです。 ただこの場合、QByteArrayが開放されているとすると、 その手前のQStringからQByteArrayへの変換時(toLocal8Bit()実行時)、QStringの一時オブジェクトは同じように開放されないのでしょうか? 失敗しているのであれば、hoge1のパターンも変換失敗となりそうな気がしています。 補足情報ですが、下記でも同じ状況(失敗)となります。 char* hoge2 = test.value("STR_TEST").toString().toLocal8Bit().data(); 私の理解不足かもしれませんが、なんとなく気になっております。 もし宜しければ、ご回答をお願いいたします。
お礼
お礼が遅くなりました。 わかりやすい説明有難うございます。 大変わかりやすく、理解する事ができました。 有難うございます。