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

Я создаю 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 ничего не меняет в данных), но ее нельзя очистить.

С уважением, Тобиас


person Tobias    schedule 10.08.2011    source источник
comment
В VS такое поведение является распространенным сигналом о том, что вы связываете неправильную библиотеку с вашим проектом, например, добавляете библиотеку режима отладки для выпуска проекта или наоборот.   -  person Raiv    schedule 10.08.2011
comment
Я не совсем уверен, так как использую VS только для редактирования, проект компилируется с помощью JAM. Я не могу скомпилировать релизную версию из-за других зависимостей, и я только связываю отладочные библиотеки Qt. Есть ли у меня возможность проверить, связана ли с проектом нужная библиотека?   -  person Tobias    schedule 11.08.2011


Ответы (2)


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

person Uga Buga    schedule 22.04.2013

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

Я попытался создать статическую структуру следующим образом:

QVariantMap
  QVariantList
    QVariantMap
      QVariantList

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

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

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

person Tobias    schedule 11.08.2011