Qt 自毁函数中的QVariantMap崩溃

Qt 自毁函数中的QVariantMap崩溃,qt,qvariant,qjson,Qt,Qvariant,Qjson,我正在使用Qt构建一个JSON对象,并使用QJson将其转换为QString。这(通常)工作正常,在本例中确实如此,但在我的Qt数据结构的析构函数中,它会因访问冲突而崩溃。对象构建良好,通过网络连接发送,函数结束后,我的应用程序崩溃 我的代码如下所示: void bar() { QVariantMap data; data.insert("Id", 1); QList<QVariant> list; //QVariantList for (QMap&

我正在使用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
QVariantMap
  QVariantList
    QVariantMap
      QVariantList
void bar()
{
qp数据;
数据。插入(“Id”,1);
QList;//QVariantList
for(QMap:conditerator…//在映射中循环
{
QMap singleEntry;//QVariantMap
insert(“LocalId”,it.value());
QList entryList;//QVariantList
for(…)//循环另一个结构
{
entryList.append(“foo”);
}
单条目。插入(“列表”,条目列表);
list.append(单条目);
}
数据。插入(“条目”,列表);
QJson::Serializer.serialize(数据);//工作正常
}//在这里坠毁
如果我删除了内部循环,它构建了
entryList
,那么一切都正常。似乎
数据的析构函数
无法删除内容,但我不知道,为什么。序列化时,整个数据结构似乎很好(我希望QJson不会改变给定数据中的任何内容),但无法清理

致以最良好的祝愿,
托比亚斯

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

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

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
QVariantMap
  QVariantList
    QVariantMap
      QVariantList
它崩溃了。如果我删除底部的QVariantList并添加QVariantMap或其他任何内容,它工作正常。我认为这是本例中嵌套级别的问题

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


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

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

在VS中,此行为是您将错误库链接到项目的常见信号-例如,添加调试模式库以发布项目,或者反之亦然。在使用VS时,我不太确定仅用于编辑,项目使用JAM编译。由于其他依赖关系,我无法编译发布版本,并且我只链接Qt调试库。我是否有机会检查正确的库是否链接到项目?