ExitProcess Error



  • Hallo,
    wenn ich mein Programm schließe, kommt folgende Meldung:

    Unbehandelte Ausnahme bei 0x75d3a4b9 in Click-Game.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xfeeefeee.
    

    Der Fehler zeigt auf die letzte Zeile von:

    void __cdecl __crtExitProcess (
            int status
            )
    {
            __crtCorExitProcess(status);
    
            /*
             * Either mscoree.dll isn't loaded,
             * or CorExitProcess isn't exported from mscoree.dll,
             * or CorExitProcess returned (should never happen).
             * Just call ExitProcess.
             */
    
            ExitProcess(status);
    }
    

    Benutze;
    Microsoft Visual C++ 2010 Express, Debug-Modus
    SFML (sfml-dev.org)

    Wo könnte der Fehler liegen oder welche Fehler verursachen so einen Exit-Error?
    MfG Trampeltier



  • Es wird vermutlich Speicher freigegeben, der schon mal freigegeben wurde. Beim exit werden noch Destruktoren aufgerufen, darin könnte eine delete für etwas schon gelöschtes stehen.



  • manni66 schrieb:

    Es wird vermutlich Speicher freigegeben, der schon mal freigegeben wurde. Beim exit werden noch Destruktoren aufgerufen, darin könnte eine delete für etwas schon gelöschtes stehen.

    Das kann eigentlich nicht sein, dass das an delete-Aufrufen liegt, weil ich nur shared_ptr benutze.
    Meine Destruktoren sind außerdem alle leer.
    Ich benutze z.T. globale shared_ptr, aber das sollte nicht der Fehler sein, da ich es auch genau so in meinem letzten Projekt gemacht habe und es funktioniert hat. Ich hatte mit Debug- und Release Modus herumgespielt, aber da sollte alles soweit stimmen. Dennoch, könnte es sein, dass Visual Studio irgendwas falsch gespeichert hat? Sollte ich das Projekt einmal kurz neu machen und alle .cpp und .h Dateien neu hinzufügen?


  • Mod

    http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_debug_values

    FEEEFEEE : "Fee fee", Used by Microsoft's debug HeapFree() to mark freed heap memory. Some nearby internal bookkeeping values may have the high word set to FEEE as well.

    Zusammen mit der Fehlermeldung ergibt dies: Es wird versucht, von einer schon freigegebenen Stelle im Speicher den Wert zu nehmen und diesen als Zeiger zu dereferenzieren.

    Trampeltier schrieb:

    .
    Ich benutze z.T. globale shared_ptr, aber das sollte nicht der Fehler sein, da ich es auch genau so in meinem letzten Projekt gemacht habe und es funktioniert hat. Ich hatte mit Debug- und Release Modus herumgespielt, aber da sollte alles soweit stimmen. Dennoch, könnte es sein, dass Visual Studio irgendwas falsch gespeichert hat? Sollte ich das Projekt einmal kurz neu machen und alle .cpp und .h Dateien neu hinzufügen?

    Ja, sicher. Dein Programm in der Entwicklungsphase ist garantiert richtig, also muss die milliardenfach geprüfte IDE einen noch unbekannten Fehler haben 🙄 .



  • SeppJ schrieb:

    http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_debug_values

    FEEEFEEE : "Fee fee", Used by Microsoft's debug HeapFree() to mark freed heap memory. Some nearby internal bookkeeping values may have the high word set to FEEE as well.

    Zusammen mit der Fehlermeldung ergibt dies: Es wird versucht, von einer schon freigegebenen Stelle im Speicher den Wert zu nehmen und diesen als Zeiger zu dereferenzieren.

    Trampeltier schrieb:

    .
    Ich benutze z.T. globale shared_ptr, aber das sollte nicht der Fehler sein, da ich es auch genau so in meinem letzten Projekt gemacht habe und es funktioniert hat. Ich hatte mit Debug- und Release Modus herumgespielt, aber da sollte alles soweit stimmen. Dennoch, könnte es sein, dass Visual Studio irgendwas falsch gespeichert hat? Sollte ich das Projekt einmal kurz neu machen und alle .cpp und .h Dateien neu hinzufügen?

    Ja, sicher. Dein Programm in der Entwicklungsphase ist garantiert richtig, also muss die milliardenfach geprüfte IDE einen noch unbekannten Fehler haben 🙄 .

    Dann gib mir bitte Beispiele, die eben diesen Fehler auslösen, ohne "delete" zu benutzen.



  • std::shared_ptr<foo> p1(new foo);
    std::shared_ptr<foo> p2(p1.get()); // Kawumm.
    


  • Trampeltier schrieb:

    Dann gib mir bitte Beispiele, die eben diesen Fehler auslösen, ohne "delete" zu benutzen.

    int main(){
        int *p; //wird mit 0xFEEEFEEE initialisiert
        *p = 42; //crasht mit einer Zugriffsverletzung auf 0xFEEEFEEE
    }
    


  • In meinem Beispiel erstelle ich einen shared_ptr, der global definiert ist und am anfang des Programmes initialisiert wird.
    Dieser shared_ptr wird dann in einen Vektor von shared_ptr sozusagen "gepusht".
    Der Vektor wiederum ist Teil eines shared_ptr Objektes, welches in einen Vektor von shared_ptr Objekten "gepusht" wird. Dieser Vektor von shared_ptr Objekten ist wiederum in einem anderen Objekt.
    Wenn also jetzt der Destruktor dieses Objektes aufgerufen wird, was passiert dann genau?

    Freue mich auf Antworten; Beispielcode gebe ich Morgen.
    Bin erstmal schlafen 🙂



  • nwp3 schrieb:

    Trampeltier schrieb:

    Dann gib mir bitte Beispiele, die eben diesen Fehler auslösen, ohne "delete" zu benutzen.

    int main(){
        int *p; //wird mit 0xFEEEFEEE initialisiert
        *p = 42; //crasht mit einer Zugriffsverletzung auf 0xFEEEFEEE
    }
    

    p wird hier mit 0xCCCCCCCC initialisiert werden (uninitialisierter Stackspeicher). 0xFEEEFEEE ist eindeutig bereits freigegebener Heapspeicher...


  • Mod

    Trampeltier schrieb:

    Dann gib mir bitte Beispiele, die eben diesen Fehler auslösen, ohne "delete" zu benutzen.

    Dein Code. Den darfst du mal selber posten, wenn du genauere Hilfe dazu willst.

    Du hast wirklich eine komische Einstellung zu diesem Forum. Sollen wir dir etwa beweisen, dass du selber den Fehler hast, wegen dem du hier fragst? 😮



  • SeppJ schrieb:

    Trampeltier schrieb:

    Dann gib mir bitte Beispiele, die eben diesen Fehler auslösen, ohne "delete" zu benutzen.

    Dein Code. Den darfst du mal selber posten, wenn du genauere Hilfe dazu willst.

    Du hast wirklich eine komische Einstellung zu diesem Forum. Sollen wir dir etwa beweisen, dass du selber den Fehler hast, wegen dem du hier fragst? 😮

    Was verstehst du nur falsch?
    Wenn ich doch solch eine Fehlermeldung bekomme, aber kein delete benutze, frage ich mich natürlich, welchen Fehler ich sonst begangen haben könnte.
    Diese Möglichkeiten kann ich dann mit meinem Code vergleichen und gucken, ob sie zutreffen....

    EDIT:
    Ich glaube, ich habe den Fehler gefunden:

    std::vector <std::shared_ptr <classes::gui::GUIElement>> GUIElements;
    			std::vector <std::shared_ptr <classes::gui::Button>> Buttons;
    
    void classes::gui::GUIManager::Add(std::shared_ptr <classes::gui::GUIElement> GuiElement)
    {
    	this->GUIElements.push_back(GuiElement);
    
    	std::shared_ptr <classes::gui::Button> Button = std::dynamic_pointer_cast<classes::gui::Button>(GuiElement);
    	if(Button != 0)// Ist GuiElement ein Button?
    		this->Buttons.push_back(Button); // Dann füge es dem Button-Vektor hinzu
    }
    

    GUIelement ist nämlich eine virtuelle Klasse, auf der Button basiert.
    Ich brauche aber einen Vektor für alle GUIElement-shared_ptr und einen Vektor für einen Button-shared_ptr.
    Bei den Destruktoren dieser Vektoren nun, könnte da der Fehler liegen, weil eben der eine Vektor möglicherweise ein Element löschen will, das der andere Vektor schon gelöscht hat?
    Wenn ja, wie löse ich das Problem?



  • Naja, scheint wohl eine Art Debug-Bug zu sein, der mit SFML zusammen hängt:
    http://en.sfml-dev.org/forums/index.php?topic=3976.0

    Ich benutze jetzt ganz einfach TerminateProcess:
    int main()
    {
    . . .

    #ifdef _WIN32
    #ifdef _DEBUG
    TerminateProcess(GetCurrentProcess(), EXIT_SUCCESS);
    #endif
    #endif
    }


Log in to reply