2017-02-07 5 views
0

Ich bekomme eine CRT Heap Korruption erkannt Nachricht beim Ausführen der folgenden einfachen C++ - Code. Der Fehler kommt von der ::free-Methode, die von dem Destruktor QMap aufgerufen wird.QMap Destruktor bekam CRT entdeckt Nachricht

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

ich verwende Qt 5.5.1 (I gebaut Qt mit Visual Studio 2013 und konfiguriert es Windows XP Ziel durch die v120_xp Toolset verwenden).

Umwelt:

  • Mein Build-Betriebssystem ist Windows 8 64 Bit.
  • Ich änderte die Platform Tools Eigenschaft zu Visual Studio 2013 - Windows XP (v120_xp).

Wenn ich den Code der folgenden ändern, tritt der Fehler nicht auftritt:

void foo() { 
    QMap<QString, int> map; // Change the second type from QVariant to int 
    map["Sample1"] = 2; 
    map["Sample2"] = 3; 
} 

Stacktrace enthält folgende Zeilen:

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] 

Jede Hilfe wird geschätzt.

+0

Ich habe keinen Fehler mit Ihrem Code, unter Qt 5.6, VS2015. Bitte minimieren Sie Ihren Code, um einfach 'foo()' in 'main()' aufzurufen, und prüfen Sie, ob das Problem weiterhin besteht. –

+0

@MartinZhai Diese Funktion wirft keinen Fehler, wenn ich es zu einem einfachen Qt-Projekt verschiebe !! Handelt es sich um kompilerspezifische Optionen !? Ich baue dieses Projekt von CMake. – Ocean

+0

Es kann sein. Sie können die Optionen Ihrer beiden Projekte vergleichen und nach Unterschieden suchen. –

Antwort

0

Sie müssen zuerst das QVariant-Objekt erstellen, bevor Sie es der Karte zuweisen.

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

sollte die Arbeit

+0

Ich habe es getan, aber es ist nicht funktionieren. – Ocean

+0

Es sollte funktionieren, ohne zuerst 'QVariant' zu konstruieren, denn' QMap 'gibt einen Lvalue-Bezug auf' QVariant' zurück und da 'QVariant :: operator =' einen Verweis auf ein 'QVariant' als Argument erwartet , werden die Integer-Literale automatisch in 'QVariant' umgewandelt, da der jeweilige' QVariant :: QVariant (int) '-Konstruktor nicht mit' explizit' markiert ist. – jotik

0

Der Wert Struct Mitglied Alignment tun zu /Zp1 eingestellt war, habe ich es zu Standard.

Um das Problem zu lösen, gehe ich ein paar Schritte: zuerst erstellte ich ein anderes Projekt und minimiere den Quellcode, die Ziel-Binärdatei wurde ohne Fehler ausgeführt. Dann vergleiche ich die Compiler-Flags beider Projekte. Durch den Vergleich der Flags, vermutete ich, war die Ursache des Problems Struct Member Alignment Wert.