2017-05-25 8 views
1

興味深いバグを見つけよう:const QString&パラメータを渡してconst QString&に格納されたデータへのポインタconst char*を取得すると、ポインタが不正なデータを指している(一部の文字はI関数に送る)。なぜconst QString&paramがデータを返す悪いconst char *ポインタを返す

LogbookNote LBHasher::makePropsFromPseudoElement(const QString& id) 
{ 
    LogbookNote rv; 
    if (m_ctx->currentTrim) { 
    const char* charId = id.toLatin1().data(); 
    ... 
    qDebug() << charId; 
} 

とコードを呼び出す:あなたはメソッドIDを呼び出すには、言及することができたよう

LogbookNote LBHasher::makePropsByNameConvention(QString id) 
{ 
    LogbookNote g; 
    if (id.startsWith("_ctx_")) { 
     g = makePropsFromPseudoElement(id); 
... 
} 

は、QStringとしてQStringオブジェクトの、すなわち全体のコピーをしています。したがって、const QString&は、強い(破損していない、一時的なオブジェクトを削除するなど)参照になります。

なぜこのような現象が発生しましたか?

+0

Btw ... '' 'qDebug()<< qPrintable(id)' '' –

+0

おそらくこの質問のタイトルを修正する必要がありますか? – AlexanderVX

答えて

3

id.toLatin1()は、QByteArrayインスタンスを一時的に作成します。その一時的に管理されているバッファへのポインタを格納します。セミコロンでは、一時的なものが破壊され、ポインタがぶら下がってしまいます。そのポインタを使用すると、未定義の動作が発生します。

+0

OK、それがポイントです。しかし、なぜそのような行動が一度だけ起こったのですか?このコードを2回目に呼び出すと、ポインタがうまく動作します。 – Juriy

+2

「動作していると思われる」は、未定義の動作の可能性のある表現の1つです。 –

2

QString::toLatin1は、値でQByteArrayを返します。つまり、一時的なオブジェクトです。そのQByteArrayは、無効なオブジェクトへのポインタを残すその行の最後(完全な式)で破棄され、それを使用することは未定義の動作です。

関連する問題