0

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

最好的问候,托拜厄斯

4

2 回答 2

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() 上的崩溃。

于 2013-04-22T16:45:06.310 回答
0

我有一个小解决方法,这符合我的需要。我仍然不知道为什么会发生这种崩溃,但我知道,这应该是问题所在。

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

QVariantMap
  QVariantList
    QVariantMap
      QVariantList

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

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

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

于 2011-08-11T09:38:36.457 回答