我们有一个函数可以将从C库检索的JSON对象转换为QVariants。所有数据类型都可以正常工作---布尔值,数字,字符串,对象/地图---除了列表。当函数返回一个列表时,由于“指定给RtlValidateHeap的地址无效”,它在函数退出时崩溃,我认为这意味着发生了双重空闲。在Visual Studio 2008中返回QVariantList崩溃
下面的代码演示了错误:
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的二进制版本兼容。我已经从http://qt.nokia.com/downloads/sdk-windows-cpp下载了Qt 4.7.3。
当列表超出范围时发生崩溃;只要返回值传回到调用堆栈中,就不会发生崩溃。
谢谢你的回答。
是的,我充分认识到编译器构造一个的QVariant当我返回另一个值,但我可以肯定的是,编译器相比,从我会:-)
什么明确的编码隐式构造了一个同样出色的QVarint从我提供的链接进行安装时,安装了MinGW和Visual Studio 2008的库。我已将\ Desktop \ Qt \ 4.7.3 \ msvc2008 \ lib添加到我的全局库文件搜索路径中,并且当我运行我的程序时,Visual Studio输出窗口仅列出来自\ Desktop \ Qt \ 4.7.3 \ msvc2008的DLL加载。
错误发生在msvcr90d.dll中,大概是当内存被第二次释放时。很难说,因为堆栈似乎被破坏了。
该应用程序是一个相当大的应用程序,只有用C++编写的图形用户界面,其余的是C.这可能是一个问题?该程序加载msvcp90d.dll和msvcr90d.dll。
我现在从源码构建Qt。一旦我尝试过,我会在这里添加评论。 –