Klassen-Variable wird beim Aufruf von "new" überschrieben



  • Hallo,
    ich habe eine Variable in einer Klasse, die wird ganz normal initialisiert im Konstruktor.

    Anschließend erstelle ich einige Instanzen mit "new" und weise die Pointer einem Array zu.
    Plötzlich nach ca. 25 Instanzen wird dann diese Variable, bzw. die Speicherstelle dieser Variable, einfach überschrieben.
    Das passiert genau an dieser Stelle:

    creator2 = new CCard("Ereigniskarte",36,1);
    

    Werte sind wahrscheinlich egal. Es kommt wahrscheinlich darauf an, wie oft der new Befehl aufgerufen wird.
    Mit Debug Einzelschritt komm ich als nächstes zu

    void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
            {       // try to allocate size bytes
    

    Und in diesem Schritt hat sich dann die Variable, bzw. eben der bestimmte Speicherbereich verändert. Vielleicht kann das Programm nicht genug Speicher reservieren und benutzt schon bereits reservierten?
    Auf jeden Fall ändert er den Wert von 2 auf 12609048.
    Bin mir nicht sicher ob 2. Zahl bei jedem Lauf konstant ist.

    Bitte schnelle Antwort, muss das Projekt bald fertig haben... 😞



  • Kannst du bitte etwas mehr Code zeigen? Meine Kristallkugel ist gerade in Reperatur.

    Felix



  • Der 2. Codeausschnitt ist aus der new.cpp aus der Standard-Libary.
    Bei dem Aufruf von new wird die Variable überschrieben...

    Kann gerne noch mehr eigener Code liefern, aber bin mir nicht sicher ob das das Problem ist.


  • Mod


  • Mod

    ice schrieb:

    Kann gerne noch mehr eigener Code liefern, aber bin mir nicht sicher ob das das Problem ist.

    Wenn du die Ursache des Problems kennen würdest, müsstest du hier nicht fragen. Wie man Fragen richtig stellt.



  • 😡
    Man... Problem gefunden. Wenn ich array[10] zuweisen will, obwohl ich nur array[8] deklariert hab, klar dass das dann Fehler macht.
    Aber der Compiler könnt ja auch was sagen.
    Dass sich das ganze so auswirkt...

    Naja wenigstens ist das Problem jetzt behoben... 🙂



  • ice schrieb:

    Man... Problem gefunden. Wenn ich array[10] zuweisen will, obwohl ich nur array[8] deklariert hab, klar dass das dann Fehler macht.
    Aber der Compiler könnt ja auch was sagen.

    Naja, es liegt eigentlich in der Verantwortung des Programmierers, die Array-Grenzen zu überwachen. Eigentlich heisst ja

    Array[Index]
    

    dasselbe wie

    *(Array+Index)
    

    . Und meistens ist es ja nur möglich, während der Laufzeit Zugriffe zu überprüfen, und das wäre ein zusätzlicher Performancenachteil, der der Philosophie von C++ (nur das zu bezahlen, was man benötigt) widerspricht.

    Nimm sonst STL-Container, beispielsweise std::vector , da wird (zumindest bei at() , je nachdem auch bei operator[] ) eine Exception bzw. eine Assertion ausgelöst.


Anmelden zum Antworten