У нас есть функция, которая преобразует объекты JSON, полученные из библиотеки C, в QVariants. Все типы данных работают нормально - логические значения, числа, строки, объекты / карты - кроме списков. Когда функция возвращает список, происходит сбой при выходе из функции из-за «неверного адреса, указанного для RtlValidateHeap», который, как я предполагаю, означает, что произошло двойное освобождение.
Следующий код демонстрирует ошибку:
QVariant no_crash() {
QVariantMap map;
map["Hello"] = "world!";
qDebug() << map;
return map;
}
// QMap(("Hello", QVariant(QString, "world!") ) )
QVariant crash() {
QVariantList list;
list << "Hello world!";
qDebug() << list;
return list;
}
// (QVariant(QString, "Hello world!") )
Я видел сообщения об этом, но все они, похоже, касаются Visual Studio 2010 и не совместимы с двоичной версией Qt SDK. Я пробовал это с Qt 4.7.3, скачанной с http://qt.nokia.com/downloads/sdk-windows-cpp.
Сбой происходит, когда список выходит из области видимости; до тех пор, пока возвращаемое значение распространяется обратно в стек вызовов, сбоев не происходит.
Спасибо за ваши ответы.
Да, я полностью осознаю, что компилятор создает QVariant, когда я возвращаю другое значение, но я уверен, что компилятор неявно создает одинаково хороший QVarint по сравнению с тем, что было бы для меня явным кодированием: -)
При установке по предоставленной мной ссылке устанавливаются библиотеки как для MinGW, так и для Visual Studio 2008. Я добавил \ Desktop \ Qt \ 4.7.3 \ msvc2008 \ lib в мой глобальный путь поиска файлов lib, и когда я запускаю свою программу, в окне вывода Visual Studio отображаются только библиотеки DLL из \ Desktop \ Qt \ 4.7.3 \ msvc2008 как загружен.
Ошибка возникает в msvcr90d.dll, предположительно, когда память освобождается во второй раз. Трудно сказать, так как стек кажется разрушенным.
Приложение довольно большое, только с графическим интерфейсом, написанным на C ++, а остальное - C. Может ли это быть проблемой? Программа загружает как msvcp90d.dll, так и msvcr90d.dll.