Сбой QVariantMap в деструкторе - PullRequest
       21

Сбой QVariantMap в деструкторе

0 голосов
/ 10 августа 2011

Я строю JSON-объект с помощью Qt и преобразовываю его в QString с помощью QJson. Это (обычно) работает нормально, и в этом случае это так, но в деструкторе моей структуры данных 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 ничего не меняет в данных), но ее невозможно очистить.

С наилучшими пожеланиями, Tobias

Ответы [ 2 ]

1 голос
/ 22 апреля 2013

Как сказал Райв, это может произойти при смешивании dll-файлов отладки и выпуска, но, по моему мнению, это также может произойти, если приложение и библиотеки Qt используют разные библиотеки CRT.Некоторые люди говорят, что когда они перекомпилируют Qt на своих машинах, проблема исчезает, и я думаю, что это связано с тем, что библиотеки CRT после восстановления Qt совпадают с приложениями.Попробуйте установить параметр «Библиотека времени выполнения» в C / C ++. Для функции «Генерация кода» задано значение «Многопоточная отладочная DLL (/ MDd)» или «Многопоточная DLL (/ MD)» соответственно для отладки и выпуска.Некоторые типы Qt, такие как QVariantMap, QVariantList, QModelIndexList, вероятно, выделяются с помощью / MD (в DLL Qt), и когда они освобождаются с / MT (в приложении), я думаю, что это вызывает сбой.Это также может исправить сбой в QString :: toStdWString ().Чтобы связать это, возможно, для Ignore All Default Library следует установить значение No, а Ignore Specific Library не должна упоминать библиотеки crt, используемые Qt.

0 голосов
/ 11 августа 2011

У меня есть небольшой обходной путь, который соответствует моим потребностям.Я до сих пор не знаю, почему происходит этот сбой, но я знаю, в чем проблема.

Я попытался создать статическую структуру, подобную этой:

QVariantMap
  QVariantList
    QVariantMap
      QVariantList

, и она вылетает,Если я удаляю QVariantList внизу и добавляю QVariantMap или что-то еще, он работает нормально.Я думаю, что это проблема с уровнем вложенности в этом случае.

Я только что присоединился к моему списку как разделенная запятыми QString, и тогда он работает нормально.

Если кто-то из вас имеетидея, почему сбой при разрушении такой вложенной структуры (другая информация: не имеет значения, если выделить QVariants в куче и удалить их самостоятельно или стек) и как это исправить, пожалуйста, дайте мне знать.

...