Nicht nur den Speicher sondern auch den Zeiger selbst löschen



  • Hey.
    Bin gerade Zeiger am lernen. Vielleicht ist diese Frage unsinnig aber ich stelle sie mal.
    Ein Zeiger zeigt auf was (wer hätte das gedacht), doch um die Adresse oder auch den Wert aufzunehmen muss ja für den Zeiger selbst auch Speicher angelegt werden.
    int * ptr = new int;
    Wenn ich jetzt mit 'new' neuen Speicher auf dem Heap beschaffe und mit delete wieder lösche ist zwar der Speicher frei gegeben auf den der Zeiger gezeigt hat, doch der Platz für den Zeiger selbst braucht man ja auch nicht mehr.
    Der Zeiger selbst soll man ja mit 0 initialisieren nachdem das Objekt gelöscht ist auf dem der Zeiger gezeigt hat, um undefiniertes Verhalten zu verhindern wenn man den Zeiger wieder benutzt und nicht initialisiert. Wenn ich aber die Adresse des Zeigers mit "& (Adressoperator)" abfrage wird angezeigt das die Adresse nie gelöscht wird. Selbst wenn ich nach init. mit 0 noch mal delete aufrufe.
    Wie lösche ich also den Zeiger selber?

    Thx.



  • In dem du seinen Scope verlässt.

    Übrigens:

    Der Zeiger selbst soll man ja mit 0 initialisieren nachdem das Objekt gelöscht ist auf dem der Zeiger gezeigt hat, um undefiniertes Verhalten zu verhindern wenn man den Zeiger wieder benutzt und nicht initialisiert.

    Auch einen Nullzeiger zu dereferenziert, ist nicht gut.
    Die 0 nimmt man eher, damit man Abfragen kann, ob der Zeiger auf etwas (!=NULL) zeigt.



  • Genauso wie Du einen int löschst. Indem Du den Gültigkeitsbereich verläßt in dem der Zeiger definiert wurde.



  • Das dachte ich mir, deshalb habe ich nichts gefunden darüber.

    Das würde ja bedeuten das man Zeiger am besten 'lokal' benutzt!? So ein int Zeiger sind 4 B, das haut rein 😮
    Obwohl man ja sowieso soviel als möglich lokal halten soll.

    Bin noch zu neu.

    Aber Danke. 🙂



  • Dereferenzierer schrieb:

    So ein int Zeiger sind 4 B, das haut rein 😮

    Auf jeden.
    Vielleicht solltest du auf 16-Bit Systemen programmieren, die sind in Sachen Pointer nicht ganz so dreist unverschämt.



  • Aus C++ in 21 Tagen
    http://download.pearsoned.de/leseecke/c++_21Tg/data/start.htm
    Liest sich übrigens echt gut.

    Wenn man delete auf einen Zeiger anwendet, wird der Speicher, auf den der Zeiger verweist, freigegeben. Ruft man delete erneut auf diesem Zeiger auf, stürzt das Programm ab! Setzen Sie den Zeiger daher nach dem Löschen auf 0 (Null). Der Aufruf von delete für einen Null-Zeiger ist garantiert sicher. Dazu folgendes Beispiel:

    Animal *pDog = new Animal;
    delete pDog; // gibt den Speicher frei
    pDog = 0; // setzt den Zeiger auf Null
    //...
    delete pDog; // gefahrlos

    So war es. Falsch ausgedrückt vorhin.



  • Das mit den 4 B sollte ein Scherz sein, wollte es auch nur wissen, nicht weil ich die 4 Byte sparen will sondern weil es mich interessiert hat.

    In diesem Sinne.



  • SeppSchrot schrieb:

    Auch einen Nullzeiger zu dereferenziert, ist nicht gut.

    Wenn aber dein Debugger eine Fehlermeldung wie "Lesezugriff an Speicherstelle 0x00000000" ausspuckt, ist dir sofort klar, daß der Zeiger noch nicht korrekt initialisiert wurde und nicht etwa auf schon freigegebenen Speicherbereich etc. zeigt.

    Moritz


Anmelden zum Antworten