gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:57:14 25 4
gpt4 key购买 nike

我们有一个将从C库检索到的JSON对象转换为QVariants的函数。所有数据类型都可以正常工作- bool(boolean) 值,数字,字符串,对象/ map -列表除外。当函数返回列表时,由于“为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的二进制版本不兼容。我已经尝试从 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添加到我的全局lib文件搜索路径中,并且在运行程序时,Visual Studio输出窗口仅列出了\ Desktop \ Qt \ 4.7.3 \ msvc2008中的DLL。已加载。

该错误发生在msvcr90d.dll中,大概是在第二次释放内存时。很难说,因为堆栈似乎已被破坏。

该应用程序相当大,只有GUI用C++编写,其余都是C。这可能是个问题吗?该程序将同时加载msvcp90d.dll和msvcr90d.dll。

最佳答案

错误的原因是解决方案中的各个项目链接到静态运行时,而Qt库链接到动态运行时。

我浏览了20多个项目的配置以及解决方案中未包含但已链接的已构建项目的配置,结果发现,即使静态链接到C运行时,该应用程序也会崩溃。

通过打开项目的属性,导航到“配置属性”->“C / C++”并选择“代码生成”,可以更改运行时。对于发布目标,运行时库应为多线程DLL;对于调试目标,运行时库应为多线程调试DLL。

关于visual-studio-2008 - 在Visual Studio 2008中返回QVariantList崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6547896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com