Visual studio 2008 在Visual Studio 2008中返回QVariantList崩溃
我们有一个函数,可以将从C库检索到的JSON对象转换为QVariants。除列表外,所有数据类型都可以正常工作——布尔、数字、字符串、对象/映射。当函数返回一个列表时,由于“指定给RtlValidateHeap的地址无效”,它在函数退出时崩溃,我认为这意味着发生了双重空闲 以下代码演示了该错误:Visual studio 2008 在Visual Studio 2008中返回QVariantList崩溃,visual-studio-2008,qt,crash,Visual Studio 2008,Qt,Crash,我们有一个函数,可以将从C库检索到的JSON对象转换为QVariants。除列表外,所有数据类型都可以正常工作——布尔、数字、字符串、对象/映射。当函数返回一个列表时,由于“指定给RtlValidateHeap的地址无效”,它在函数退出时崩溃,我认为这意味着发生了双重空闲 以下代码演示了该错误: QVariant no_crash() { QVariantMap map; map["Hello"] = "world!"; qDebug() << map;
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!") )
QVariant无故障(){
qp地图;
地图[“你好”]=“世界!”;
qDebug()您的方法签名是
QVariant crash()
您应该返回一个QVariant,但不是QVariant,而是尝试返回一个QVariantList,它是QList
我认为你做不到
在我看来,你甚至不应该编译这个。也许这是你的问题?我发现了几个潜在的问题:
首先,您链接到的SDK是针对MinGW编译器的,而不是visual studio。您应该为编译器使用正确的SDK,或者从源代码处重新编译Qt。对于VS2008,请转到此页:并下载“适用于Windows的Qt库-VS2008”
您的代码确实在编译:所发生的是它返回一个包含QVariantMap或QVariantSet的QVariant。编译器正在为您构造一个QVariant。您的代码实际执行的是:
QVariant no_crash() {
QVariantMap map;
map["Hello"] = "world!";
qDebug() << map;
return QVariant(map); // This returns a QVariant which contains a map of QVariants
}
QVariant crash() {
QVariantList list;
list << "Hello world!";
qDebug() << list;
return QVariant(list); // This returns a QVariant which contains a list of QVariants
}
QVariant无故障(){
qp地图;
地图[“你好”]=“世界!”;
qDebug()错误原来是解决方案中的单个项目链接到静态运行时,而Qt库链接到动态运行时
我查看了20多个项目的配置,以及解决方案中未包含但链接到的已构建项目的配置,结果发现,即使是静态链接到C运行时的项目,应用程序也会崩溃
通过打开项目属性,导航到配置属性->C/C++并选择代码生成来更改运行时。对于发布目标,运行时库应为多线程DLL,对于调试目标,运行时库应为多线程调试DLL。确保C/C++代码生成中的运行时库选项设置为“多线程”分别用于调试和发布的EADEBUG DLL(/MDd)或多线程DLL(/MD)。一些Qt类型,如QVariantMap
,QVariantList
,QModelIndexList
可能与/MD一起分配(在Qt的DLL中),并且在与/MT解除分配时(在应用程序中)我认为这会导致崩溃。这也可以修复QString::toStdWString()上的崩溃
。为了实现此链接,可能应将“忽略所有默认库”设置为“否”,并且“忽略特定库”不应提及Qt使用的crt DLL。为了确保这一点,我下载了仅适用于Visual Studio的版本。这是一个更快的下载和安装过程,但它导致了相同的崩溃。错误是单个项目解决方案中的cts链接到静态运行时,而Qt库链接到动态运行时。我现在正在从源代码构建Qt。尝试后,我将在此处添加注释。QVariants可以保存QVariantList