2011-08-10 81 views
0

我正在用Qt構建一個JSON對象並使用QJson將其轉換爲QString。這(通常)工作正常,它在這種情況下,但在我的Qt數據結構的析構函數,它崩潰與訪問衝突。該對象構建正常,它通過我的網絡連接發送,並在函數結束後,我的應用程序崩潰。QVariantMap在析構函數中崩潰

我的代碼如下所示:

void bar() 
{ 
    QVariantMap data; 
    data.insert("Id", 1); 
    QList<QVariant> list; //QVariantList 

    for (QMap<...>:ConstIterator ...) //Loop through a Map 
    { 
     QMap<QString, QVariant> singleEntry; //QVariantMap 
     singleEntry.insert("LocalId", it.value()); 
     QList<QVariant> entryList; //QVariantList 
     for (...) //Loop through another structure 
     { 
      entryList.append("foo"); 
     } 
     singleEntry.insert("List", entryList); 
     list.append(singleEntry); 
    } 
    data.insert("Entries", list); 

    QJson::Serializer.serialize(data); // Works fine 
} // Crash here 

如果我刪除了內部循環,它建立了entryList,一切工作正常。看來data的析構函數不能刪除內容,但我不知道爲什麼。整個數據結構似乎在序列化它是罰款(我希望QJson不改變在給定的數據的任何東西),但它不能被清理..

最好的問候, 托比亞斯

+0

在VS中,此行爲是將錯誤的庫鏈接到項目的常見信號 - 例如,添加調試模式庫以釋放項目或反之亦然。 – Raiv

+0

我不太確定,因爲我只使用VS編輯,項目使用JAM進行編譯。由於其他依賴關係,我無法編譯發行版,而我只鏈接Qt調試庫。我有機會檢查合適的圖書館是否與該項目相關聯? – Tobias

回答

0

我得到了一個小的解決方法,這符合我的需求。我仍然不知道,爲什麼會發生這種事故,但我知道,這應該是問題所在。

我試圖建立一個靜態的結構是這樣的:

QVariantMap 
    QVariantList 
    QVariantMap 
     QVariantList 

和崩潰。如果我刪除底部的QVariantList,並添加QVariantMap或其他任何東西,它工作正常。在這種情況下,我認爲這是嵌套級別的問題。

我現在剛剛加入我的列表作爲一個逗號分隔的QString,然後它工作正常。

如果你們中的任何人有一個想法,爲什麼在破壞這樣的嵌套結構崩潰(另一個信息:如果在堆中分配QVariants並刪除它們自己或堆棧無關緊要),以及如何解決它,請讓我知道。

1

正如Raiv所說,混合調試和釋放dll時可能會發生這種情況,但在我的看法中,如果應用程序和Qt DLL使用不同的CRT庫,也會發生這種情況。有人說,當他們在他們的機器上重新編譯Qt時,問題消失了,我認爲這是因爲Qt重建後的CRT dll與應用程序相同。嘗試將C/C++代碼生成中的運行時庫選項設置爲分別針對調試和發佈的多線程調試DLL(/ MDd)或多線程DLL(/ MD)。 QVariantMap,QVariantList,QModelIndexList等一些Qt類型可能會被分配給/ MD(在Qt的dll中),並且當它們被解除分配給/ MT(在應用程序中)時,我認爲這會導致崩潰。這也可以修復QString :: toStdWString()的崩潰。爲了鏈接,可能忽略所有默認庫應設置爲否,忽略特定庫不應提及Qt使用的crt dll。