QVariantMap在析构函数中崩溃

时间:2011-08-10 12:43:03

标签: qt qvariant qjson

我正在用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不会改变给定数据中的任何内容)但是它无法清理..

最诚挚的问候, 托拜厄斯

2 个答案:

答案 0 :(得分:1)

正如Raiv所说,混合调试和发布dll时会发生这种情况,但在我看来,如果应用程序和Qt DLL使用不同的CRT库,也会发生这种情况。有人说当他们在机器上重新编译Qt时问题消失了,我认为这是因为Qt重建后的CRT dll与应用程序相同。尝试在C / C ++中设置运行时库选项代码生成分别设置为多线程调试DLL(/ MDd)或多线程DLL(/ MD)用于调试和发布。一些Qt类型如QVariantMap,QVariantList,QModelIndexList可能用/ MD(在Qt的dll中)分配,当它们用/ MT(在应用程序中)解除分配时,我认为这会导致崩溃。这也可以修复QString :: toStdWString()的崩溃。为了将其链接起来,可以将忽略所有默认库设置为否,忽略特定库不应该提及Qt使用的crt dll。

答案 1 :(得分:0)

我得到了一些解决方法,符合我的需求。我仍然不知道,为什么会发生这种崩溃,但我知道,这应该是问题所在。

我试图建立一个这样的静态结构:

QVariantMap
  QVariantList
    QVariantMap
      QVariantList

它崩溃了。如果我删除底部的QVariantList并添加QVariantMap或其他任何东西,它工作正常。我认为在这种情况下这是嵌套级别的问题。

我现在刚刚加入我的列表作为逗号分隔的QString然后它工作正常。

如果你们中有人有想法,为什么崩溃会破坏这样一个嵌套的结构(另一个信息:如果在堆中分配QVariants并自行删除或堆栈无关紧要)以及如何修复它,请告诉我