我們有一個函數可以將從C庫檢索的JSON對象轉換爲QVariants。所有數據類型都可以正常工作---布爾值,數字,字符串,對象/地圖---除了列表。當函數返回一個列表時,由於「指定給RtlValidateHeap的地址無效」,它在函數退出時崩潰,我認爲這意味着發生了雙重空閒。在Visual Studio 2008中返回QVariantList崩潰
下面的代碼演示了錯誤:
QVariant no_crash() {
QVariantMap map;
map["Hello"] = "world!";
qDebug() << map;
return map;
}
// QMap(("Hello", QVariant(QString, "world!")))
QVariant crash() {
QVariantList list;
list << "Hello world!";
qDebug() << list;
return list;
}
// (QVariant(QString, "Hello world!"))
我已經看到了這個帖子,但他們似乎都對Visual Studio 2010和它不是用了Qt SDK的二進制版本兼容。我已經從http://qt.nokia.com/downloads/sdk-windows-cpp下載了Qt 4.7.3。
當列表超出範圍時發生崩潰;只要返回值傳回到調用堆棧中,就不會發生崩潰。
謝謝你的回答。
是的,我充分認識到編譯器構造一個的QVariant當我返回另一個值,但我可以肯定的是,編譯器相比,從我會:-)
什麼明確的編碼隱式構造了一個同樣出色的QVarint從我提供的鏈接進行安裝時,安裝了MinGW和Visual Studio 2008的庫。我已將\ Desktop \ Qt \ 4.7.3 \ msvc2008 \ lib添加到我的全局庫文件搜索路徑中,並且當我運行我的程序時,Visual Studio輸出窗口僅列出來自\ Desktop \ Qt \ 4.7.3 \ msvc2008的DLL加載。
錯誤發生在msvcr90d.dll中,大概是當內存被第二次釋放時。很難說,因爲堆棧似乎被破壞了。
該應用程序是一個相當大的應用程序,只有用C++編寫的圖形用戶界面,其餘的是C.這可能是一個問題?該程序加載msvcp90d.dll和msvcr90d.dll。
我現在從源碼構建Qt。一旦我嘗試過,我會在這裏添加評論。 –