Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 在Visual Studio 2008中返回QVariantList崩溃_Visual Studio 2008_Qt_Crash - Fatal编程技术网

Visual studio 2008 在Visual Studio 2008中返回QVariantList崩溃

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;

我们有一个函数,可以将从C库检索到的JSON对象转换为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!") )
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