QMap析构函数得到了CRT检测到的消息

时间:2017-02-07 07:18:55

标签: c++ qt

运行以下简单的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。)

环境:

  • 我的构建操作系统是Windows 8 64位。
  • 我将平台工具属性更改为 Visual Studio 2013 - Windows XP(v120_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] 

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

在将QVariant对象分配给地图之前,必须先构造它。

void foo() {
    QMap<QString, QVariant> map;
    map["Sample1"] = QVariant(2);
    map["Sample2"] = QVariant(3);
}

应该做的工作

答案 1 :(得分:0)

结构成员对齐的值设置为 / Zp1 ,我将其更改为默认

为了解决这个问题,我遵循了一些步骤:首先我创建了另一个项目并最小化了源代码,目标二进制文件被执行而没有任何错误。然后我比较两个项目的编译器标志。通过比较标志,我猜测问题的原因是结构成员对齐值。