【发布时间】:2011-07-01 12:23:40
【问题描述】:
我们有一个函数可以将从 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!") )
我看过关于这个的帖子,但它们似乎都是关于 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。一旦我尝试过,我会在这里添加评论。
标签: visual-studio-2008 qt crash