运行以下简单的C ++代码时,我收到检测到CRT堆损坏消息。该错误来自::free
析构函数调用的QMap
方法。
void foo() {
QMap<QString, QVariant> map;
map["Sample1"] = 2;
map["Sample2"] = 3;
}
我正在使用Qt 5.5.1(我使用Visual Studio 2013构建了Qt,并使用v120_xp工具集将其配置为目标Windows XP。)
环境:
当我将代码更改为以下内容时,不会发生错误:
void foo() {
QMap<QString, int> map; // Change the second type from QVariant to int
map["Sample1"] = 2;
map["Sample2"] = 3;
}
Stacktrace包含以下行:
msvcr120d.dll!_free_dbg_nolock(void * pUserData, int nBlockUse) Line 1376 C++
msvcr120d.dll!_free_dbg(void * pUserData, int nBlockUse) Line 1265 C++
msvcr120d.dll!free(void * pUserData) Line 49 C++
Qt5Cored.dll!qMapDeallocate(QMapNodeBase * node, int alignment) Line 318 C++
Qt5Cored.dll!QMapDataBase::freeTree(QMapNodeBase * root, int alignment) Line 349 C++
Qt5Cored.dll!QMapDataBase::freeTree(QMapNodeBase * root, int alignment) Line 349 C++
Armaghan.exe!QMapData<QString,QVariant>::destroy() Line 225 C++
Armaghan.exe!QMap<QString,QVariant>::~QMap<QString,QVariant>() Line 339 C++
Armaghan.exe!foo() Line 32 C++
Armaghan.exe!main(int argc, char * * argv) Line 37 C++
[External Code]
任何帮助将不胜感激。
答案 0 :(得分:0)
在将QVariant对象分配给地图之前,必须先构造它。
void foo() {
QMap<QString, QVariant> map;
map["Sample1"] = QVariant(2);
map["Sample2"] = QVariant(3);
}
应该做的工作
答案 1 :(得分:0)
结构成员对齐的值设置为 / Zp1 ,我将其更改为默认。
为了解决这个问题,我遵循了一些步骤:首先我创建了另一个项目并最小化了源代码,目标二进制文件被执行而没有任何错误。然后我比较两个项目的编译器标志。通过比较标志,我猜测问题的原因是结构成员对齐值。