Muss ich einen Pointer auf einen Pointer löschen?



  • Hallo, ich hab eine kleien Frage, und zwar muss ich einen Pointer löschen, der auf einen Pointer zeigt oder wird dieser automatisch gelöscht, wenn die Funktion verlassen wird?
    Hier der Abschnitt um den es geht:

    Saver* save = (Saver*)saver;
    

    Wenn ich versuche mit

    delete save;
    

    den Pointer zu löschen. entsteht bei der Ausführung eine Zugriffsverletzung.
    Hoffe ihr könnt mir helfen.



  • Kleiner Nachtrag..

    saver
    

    ist ein Pointer auf die struct Saver

    Saver* saver = new Saver();
    


  • Nein, musst du nicht. Was du mit delete/delete[] freigibst, ist ja nicht die Zeigervariable selbst, sondern der Speicher, auf den sie zeigt (und der mit new/new[] alloziert wurde). Deine Zeigervariable ist eigentlich eine ganz normale, integrale Stackvariable (somit wird sie am Ende ihres Scopes gnadenlos vernichtet 😉 ). Nur, dass sie halt ein wenig anders interpretiert wird und du mit ihr auf einen Speicherbereich zeigen kannst.



  • a874158 schrieb:

    Hallo, ich hab eine kleien Frage, und zwar muss ich einen Pointer löschen, der auf einen Pointer zeigt

    Dein Zeiger zeigt nicht auf einen anderen Zeiger, sondern auf das Objekt. Der Cast ist zudem unnötig.

    Saver* saver = new Saver();
    Saver* save = saver;
    // beide Zeiger zeigen auf das gleiche Objekt
    
    delete saver; // nur einmal freigeben!
    

    P.S. Im C++-Unterform wäre sowas nächstes Mal besser aufgehoben. 😉



  • Danke erstmal für die schnellen Antworten.

    Dein Zeiger zeigt nicht auf einen anderen Zeiger, sondern auf das Objekt.

    Danke, werd ich mir merken.

    Der Cast ist zudem unnötig.
    [cpp]Saver* saver = new Saver();
    Saver* save = saver;

    Es wird vorher in einen LPVOID gecastet.

    P.S. Im C++-Unterform wäre sowas nächstes Mal besser aufgehoben. 😉

    Sorry, hab das C++ Unterforum übersehen.



  • a874158 schrieb:

    Der Cast ist zudem unnötig.
    [cpp]Saver* saver = new Saver();
    Saver* save = saver;

    Es wird vorher in einen LPVOID gecastet.

    Unabhängig davon, ob zwischendurch noch irgendwo nach LPVOID gecastet wird (das Ergebnis speicherst du aber dann in einer anderen Variable, richtig?), haben save und saver den gleichen Typen, und den kannst du auch nicht ändern. Ergo muss bei einer Zuweisung nicht gecastet werden.


Anmelden zum Antworten