我正在用Qt构建一个json对象,并将其转换为使用QJson的QString。这(通常)工作得很好,在这种情况下确实如此,但在我的Qt数据结构的析构函数中,它因访问冲突而崩溃。对象构建良好,它通过我的网络连接发送,在函数结束后,我的应用程序崩溃。
我的代码是这样的:
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不会改变给定数据中的任何内容),但它无法清理…
最诚挚的问候,托拜厄斯
正如Raiv所说,这可能发生在混合调试和发布DLL时,但在我看来,如果应用程序和Qt DLL使用不同的CRT库,这也可能发生。有些人说,当他们在自己的机器上重新编译Qt时,问题消失了,我认为这是因为Qt重建后的CRT dll与应用程序相同。尝试将C/c++代码生成中的"运行时库"选项分别设置为"调试"one_answers"发布"时的"多线程Debug DLL (/MDd)"或"多线程DLL (/MD)"。一些Qt类型如QVariantMap, QVariantList, QModelIndexList可能与/MD(在Qt的dll中)分配,当它们与/MT(在应用程序中)被释放时,我认为这会导致崩溃。这也可以修复QString::toStdWString()的崩溃。为了使其链接,可能忽略所有默认库应设置为No,忽略特定库不应提及Qt使用的crt dll。
我找到了一个适合我需要的变通方法。我仍然不知道为什么会发生这个崩溃,但我知道,这应该是问题所在。
我试着建立一个这样的静态结构:
QVariantMap
QVariantList
QVariantMap
QVariantList
然后崩溃。如果我在底部删除QVariantList并添加QVariantMap或其他任何东西,它工作得很好。我认为这是嵌套级别的问题。
我现在刚刚加入了我的列表作为一个逗号分隔的QString,然后它工作得很好。
如果你们中的任何人有一个想法,为什么崩溃在破坏这样一个嵌套结构(另一个信息:不要紧,如果分配qvariables在堆和删除他们自己或堆栈),以及如何修复它,请让我知道。