2017-12-08 7 views
-2

Ich versuche, die Methode clear() auf einem std :: map, ohne sich eine "Exception geworfen aufzurufen: Lesezugriff violation._Pnode 0xDDDDDDDD wurde . ".std :: map.clear() wirft eine Lesezugriffsverletzung

//I have narrowed down the error to this group of code 
#include "stdafx.h" 
#include <map> 
#include <iostream> 

class Input 
{ 
    std::map<int, bool> pressedKeys; 
    std::map<int, bool> heldKeys; 
    std::map<int, bool> releasedKeys; 

public: 
    void Update() 
    { 
     heldKeys.clear(); 
     pressedKeys.clear(); 
     releasedKeys.clear(); 
    } 
}; 

class Window 
{ 
private: 
    Input * input; 
    void Update() 
    { 
     input->Update(); 
    } 
public: 
    Window() 
    { 
     input = &Input(); 

     while (true) 
     { 
      this->Update(); 
     } 
    } 
}; 

int main() 
{ 
    Window w = Window(); 
} 

Die Ausnahme geschieht immer auf "heldKeys.clear();" Der Debugger in Visual Studio bringt mich auf eine Seite namens "xtree." Der Code, der folgt, ist der Code um, wo die Ausnahme geschieht in „xtree:“

void _Erase(_Nodeptr _Rootnode) 
    { // free entire subtree, recursively 
    for (_Nodeptr _Pnode = _Rootnode; !_Pnode->_Isnil; _Rootnode = _Pnode) //The error occurs here 
     { // free subtrees, then node 
     _Erase(_Pnode->_Right); 
     _Pnode = _Pnode->_Left; 
     _Alnode& _Al = this->_Getal(); 
     _Alnode_traits::destroy(_Al, _STD addressof(_Rootnode->_Myval)); 
     _Node::_Freenode0(_Al, _Rootnode); 
     } 
    } 

ich keine Ausnahmen erwarten. Ich bin die Ausnahme bekommen „Ausnahme ausgelöst: Lesezugriff Verletzung _Pnode 0xDDDDDDDD war..“ Wenn mehr Klarstellung erforderlich ist bitte kommentieren.

+1

Bitte posten Sie ein [mcve]. – PaulMcKenzie

+0

Das Problem ist nicht in dem, was Sie gezeigt haben. Das Problem liegt nicht im Microsoft-Code, es sei denn, Sie sind sehr unglücklich. – chris

+0

Dieser Code wurde auch in die Frage eingegeben, anstatt aus Ihrem echten Programm kopiert und eingefügt zu werden. Sie haben 'heldkeys' in Ihrer Klasse deklariert, aber in Ihrer' Update() 'Funktion verwenden Sie' heldKeys' (Großbuchstaben ** K **). – PaulMcKenzie

Antwort

2

Haben Sie alle Warnungen in Ihrem Compiler aktiviert? Wirklich irgendein ziemlich neuer hochwertiger C++ - Compiler sollte dies erfassen. Z.B. Geh zu http://rextester.com/l/cpp_online_compiler_clang und geben Sie den Code, den stdafx.h Header zu entfernen, die ohnehin nicht benötigt wird, und Sie werden sehen:

source_file.cpp:31:17: error: taking the address of a temporary object of type 'Input' [-Waddress-of-temporary] 
     input = &Input(); 
       ^~~~~~~~ 

(. Mit Klirren 3.8 als Compiler)

Dies beweist, eine viel effizientere Methode zum Finden einer großen Klasse von normalen Programmierfehlern im Vergleich zu Stack Overflow. Andere Fehlerklassen können das Aktivieren zusätzlicher Analysedurchläufe oder Sanitizer wie den Adreßdesinfektionsdienst von clang, den Speicherdesinfizierer oder den Sanitizer des nicht definierten Verhaltens umfassen.

Verwandte Themen