gl5_progのメモ

自分のためのメモとかまとめとか

QStringをconst char*に変換するときの罠

QStringをconst char*に変換する処理で罠に引っかかってしまったので紹介。 いや、悪いのは自分なのですが。
ちなみにQt4.7です。


まず、最初に書いたコード。
PlainTextEditに入力された文字列をUTF8のconst char*(厳密にはconst uint8_t*)に変換しようとしてます。

QString sourceStr = ui->plainTextEdit->toPlainText();
pANTLR3_UINT8 input_string = (pANTLR3_UINT8)sourceStr.toUtf8().constData();

この時点での間違い

  • toUtf8()の戻り値は一時変数なのでconstData()の戻り値であるポインタの中身はすぐに破棄される

これは自分のミス。


そして、一時変数を保持するように修正。
toUtf8()した結果を最初からもっておけばいいじゃんと。

QString sourceStr = ui->plainTextEdit->toPlainText().toUtf8();
pANTLR3_UINT8 input_string = (pANTLR3_UINT8)sourceStr.constData();

しかし、これも間違い。

  • toUtf8()の戻り値がQStringだという「誤解」
  • しかし、暗黙の型変換によりQStringをQByteArrayで初期化できてしまうという「偶然」
  • QStringもconstData()メンバ関数を持っていたのでビルドも通ってしまったという「偶然」
  • 戻り値const QChar*だしQString::constData()でいけるという「誤解」(QCharは2バイトUnicode文字)

誤解と偶然がうまいこと重なったミスでした。


最終的なコード。

QByteArray sourceStr = ui->plainTextEdit->toPlainText().toUtf8();
pANTLR3_UINT8 input_string = (pANTLR3_UINT8)sourceStr.constData();

まとめ

  • ちゃんと関数の戻り値は確認しよう。