簡體   English   中英

為什么const QString&param返回錯誤的const char *指向數據的指針

[英]Why const QString& param return bad const char* pointer to data

找出有趣的bug:當我傳遞const QString& parameter然后獲取const char*指向存儲在const QString&數據時,指針指向壞數據(某些字符看起來不像我發送給函數)。

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);
 ...
 }

如你QString ,調用方法id來自QString ,即QString對象的完整副本。 因此const QString&可以是一個強大的(沒有破壞,刪除臨時對象,例如)引用。

為什么發生這種行為?

id.toLatin1()創建一個臨時的QByteArray實例。 然后,您將指針存儲到該臨時管理的緩沖區。 在分號處,臨時被摧毀,指針懸空; 之后使用該指針會顯示未定義的行為。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM