Failure #2 - Stack around the variable 'blubb' was corrupted.



  • Also, an sich glauch ich weiß ich ja was die fehlermeldung bedeutet (man hat halt aus seinen speicherbereich rausgeschrieben), nur bei meinem aktuellen code frag ich mich schon etwas wo das überhaupt sein könnte.
    Ich verwende als include:
    #include <stdlib.h>
    #include <SDL.h>
    #include <vector>

    "blubb" ist ein testobject meiner Klasse die ich da grad versuch zu erstellen (soll objekte auf dem bildschirm bewegen und animieren)
    Beim vector schreib ich nur mit .push_back.
    Eigenen Speicher mit new leg ich mir nicht an.

    Hat jemand ne idee wo das herkommen kann?
    Tritt diese Fehlermeldung bei VC auch auf, wenn man ungültige Bereiche liest?(dachte curropted is nur n falsches schreiben :/)
    Dass ich das evtl bei vector mach könnt ich mir nämlich vorstellen

    Ich will jetzt niemand ausschicken meinen hässlichen code (variablenname "blubb" sagt schon alles ;)) zu debuggen, aber eine idee wo ich anfangen kann wär nett.

    Also, die eigentlich Frage ist eben: Tritt so eine debug Fehlermeldung auf wenn man bei einem vector einen ungültigen Bereich liest?

    Alles andere wär nur Bonus falls euch langweilig is oder Kontextinformation :>



  • Wenn du außerhalb des vector-Inhalts zugreifst, ist das undefiniertes Verhalten - da kann der Compiler alles machen, was ihm gefällt.

    (vielleicht kannst du den Fehler ja schon einschränken, wenn du statt der [] Zugriffe auf die vector-Elemente at() verwendest - das hat definiertes Verhalten (exception))



  • Hm vielen dank, konnte das Problem jetzt auf eine Zeile beschränken (wenn ich die auskommentier kommts nicht mehr).. sinn machts aber keinen, glaub ich.. naja, auf jedenfall danke, frage is beantwortet 🙂



  • Ok, nachdem auch ein Freund den ich um rat gefrag hab nicht mehr weitermusste, hier der (stark zusammengekürzte) aber immer noch fehlerhafte code... meiner Meinung nach macht des einfach net wirklich sinn 😕
    main.cpp:

    #include <stdlib.h>
    #include <SDL.h>
    #include "MoveAnimatedObject.h"
    
    int main(int argc, char *argv[])
    {
       SDL_Surface *screen, *image, *background, *image2;
       if (SDL_Init(SDL_INIT_VIDEO) == -1) {
           printf("Can't init SDL:  %s\n", SDL_GetError());
           exit(1);
       }
       atexit(SDL_Quit); 
       screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE);
       image=SDL_LoadBMP("movement1.bmp");
       image2=SDL_LoadBMP("movement2.bmp");
       background=SDL_LoadBMP("menu.bmp");
       MoveAnimatedObject blubb(0,0, background, image, screen);
       return 0;
    }
    

    MoveAnimatedObject.h

    #ifndef BS_POKECLON_MOVEANIMATEDOBJECT
    #define BS_POKECLON_MOVEANIMATEDOBJECT
    #include <stdlib.h>
    #include <SDL.h>
    #include <vector>
    
    class MoveAnimatedObject {
    	private:
    		int animationSpeed;
    		SDL_Surface *background;
    		SDL_Surface *movableObject;
    		SDL_Surface *screen;
    		SDL_Rect position;
    		std::vector<SDL_Surface*> objectFrames;
    		unsigned int currentFrame; //falls nur eine dieser zeilen auskommentiert wird=>kein fehler
    	public:
    		MoveAnimatedObject();
    		MoveAnimatedObject(int x,int y, SDL_Surface *background2, SDL_Surface *movableObject, SDL_Surface *screen2);
    //geändert sodass der konstruktor keine parameter mehr nimmt=>kein fehler
    		~MoveAnimatedObject();
    
    };
    #endif
    

    MoveAnimatedObject.cpp

    #include "MoveAnimatedObject.h"
    #include <string>
    #include <vector>
    
    MoveAnimatedObject::MoveAnimatedObject() {
    }
    
    MoveAnimatedObject::MoveAnimatedObject(int x,int y, SDL_Surface *background2, SDL_Surface *movableObject, SDL_Surface *screen2) 
    //geändert sodass der konstruktor keine parameter mehr nimmt=>kein fehler
    {
    	currentFrame=0; //auskommentiert=>kein fehler
    	animationSpeed=1; //produziert den fehler wenn man die deklaration von animationSpeed in der header-datei unter die deklaration von currentFrame setzt
    }
    MoveAnimatedObject::~MoveAnimatedObject() {
    }
    

    Meiner bescheidenen Meinung nach darf es diesen Fehler eigentlich gar net geben -.- Aber bin zugegebenermaßen auch kein experte 😕



  • Kann dein Problem hier nicht nachvollziehen, außerdem was hat es mit MFC zu tun?
    Wenn du wissen willst, wer deinen Stack kaputt macht, kannst du einen "data breakpoint" an der entsprechenden Stelle setzen.



  • Mit MFC: Nichts
    Mit visual c++, (dafür is das forum hier ja laut faq auch da) weil ich irgendwie geglaubt das der fehler spezifisch an der ide liegen könnte, ne menge.

    Hab das Problem jetzt "gelöst"...
    Neues Projekt erstellt, code copy+paste und er hat keine probleme mehr mit stack curroption... ergo wars wirklich ein visual c++ problem 😕
    Interessieren woher das kam würds mich trotzdem, aber das bleibt wohl eins der mysterien der welt...

    Aber trotzdem, danke für die Hilfe.


Anmelden zum Antworten