Exception wird beim Freigeben des Heap mit delete xxx geworfen



  • Hallo,
    ich übe mich gerade im Umgang mit der dynamischen Speicherverwaltung und ich erhalte eine Ausnahme,
    ( [Die unten aufgeführten Frames sind möglicherweise nicht korrekt und/oder fehlen, für "ntdll.dll" wurden keine Symbole geladen.] Unbekannt)

    wenn ich mit delete ptr; den Speicher am Heap freigeben möchte.

    Hier mein Code Beispiel:

    	int *ptr{nullptr};			// int-Pointer erstellen
    	ptr = new int;				// Speicher für eine int-Speicherstelle am heap reservieren
    
    	cout << ptr << endl;		// Adresse des int-Pointers am heap ausgeben
    	cout << *ptr << endl;		// Inhalt des int-Pointers ausgeben - garbage
    
    	*ptr = 100;					// 100 an die Adresse dereferenzieren
    	ptr++;						// ptr inkrementieren
    	*ptr = 200;					// 200 an die Adresse ptr + 1 dereferenzieren
    	ptr++;						// ptr inkrementieren
    	*ptr = 300;					// 300 an die Adresse ptr + 2 dereferenzieren
    
    	cout << *ptr << endl;		// 300
    	ptr--;						// ptr dekrementieren
    	cout << *ptr << endl;		// 200
    	ptr--;						// ptr dekrementieren
    	cout << *ptr << endl;		// 100
    
    	delete ptr;					// Speicher am heap freigeben
    

    Kann mir jemand sagen, was ich hier falsch mache? Danke!



  • @ledi001 sagte in Exception wird beim Freigeben des Heap mit delete xxx geworfen:

    ptr++;						// ptr inkrementieren
    *ptr = 200;					// 200 an die Adresse ptr + 1 dereferenzieren
    

    Wieviele int hast du?



  • @manni66
    Ich verstehe jetzt deine Frage nicht genau.



  • @ledi001

    Genauer gefragt: Für wieviele int hast du Platz reserviert?



  • in dem Fall für einen.
    D.h. ich darf mit ptr++ nicht einfach auf eine neue Speicherstelle referenzieren ohne vorher dafür Platz am Heap zu reservieren?



  • @ledi001 sagte in Exception wird beim Freigeben des Heap mit delete xxx geworfen:

    D.h. ich darf mit ptr++ nicht einfach auf eine neue Speicherstelle referenzieren ohne vorher dafür Platz am Heap zu reservieren?

    Warum überrascht dich das?

    Dur darfst natürlich auch nicht einfach delete auf ptr aufrufen, wenn er nicht auf den Anfabg zeigt.

    Benutze std::vector.



  • OK, Danke!

    Eine Frage noch.

    Wenn ich den Speicher am heap für ein Array freigebe
    mache ich das mit delete myArray oder delete [] myArray;? bzw. was ist der Unterschied?

    int *myArray = new int[4];	// Array für 4 Elemente am heap reservieren
    
    delete [] myArray;		// Speicher am heap freigeben
    


  • @ledi001 Der Unterschied ist, dass delete nur das erste Element löschen würde. delete [] myArray; ist also richtig. Siehe https://ideone.com/9JzQUW.
    Es gibt aber wesentlich bessere Alternativen:

    #include <array>
    #include <vector>
    
    int main()
    {
      std::vector<int> myvector(4);
      // falls N zur Kompilierzeit festesteht
      std::array<int, 4> myarray;
    
    }  // es muss nichts freigegeben werden, das geschieht automatisch (Stichwort RAII).


  • @ledi001 sagte in Exception wird beim Freigeben des Heap mit delete xxx geworfen:

    was ist der Unterschied?

    Das eine ist richtig (delete[]), das andere ist falsch.

    Und noch der obligatorische Hinweis, dass man das, was du da gerade machst, so gut wie nie das ist, was man in einem 'echten' Programm nutzen sollte. Manni hat das Stichwort ja schon gegeben: std::vector.



  • Neben std::vector gibt es auch noch std::make_unique<int[]>(4), wenn du sicher bist, dass du exakt 4 Elemente brauchst.

    Jedenfalls solltest du vermeiden, von Hand new und delete / delete[] aufzurufen. Man kann zu leicht Fehler machen (zum Beispiel delete mit delete[] verwechseln, delete mehrfach oder gar nicht aufrufen).

    In 99% der Fälle wird std::vector das richtige sein.


Log in to reply