2017-05-25 41 views
1

找出有趣的bug:當我通過const QString&參數,然後const char*指針指向存儲在const QString&內的數據時,指針指向壞數據(一些字符看起來不像I發送到功能)。爲什麼常量QString&參數返回不良const char *指向數據

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

,並調用代碼:

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

正如你所提到,調用方法ID來作爲QString,即整個QString對象的副本。因此const QString&可以是一個強大的(不是破碎的,以刪除的臨時對象爲例)的引用。

爲什麼會發生這種行爲?

+0

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

+0

也許這個問題的標題有待更正? – AlexanderVX

回答

3

id.toLatin1()創建臨時實例QByteArray。然後您將指針存儲到由該臨時文件管理的緩衝區中。在分號處,臨時指針被破壞,指針懸空;使用該指針稍後會顯示未定義的行爲。

+0

好吧,這是關鍵。但爲什麼這樣的行爲只發生過一次?意思是當我第二次調用這個代碼時,指針運行良好。 – Juriy

+2

「似乎工作」是未定義行爲的一種可能表現形式。 –

2

QString::toLatin1按值返回QByteArray,這意味着它是一個臨時對象。 QByteArray在該行結束時被銷燬(完整表達式),留下指向無效對象的指針並使用它是未定義的行爲。

相關問題