Zeiger und Objekte auf die gezeigt wird - eine Erklärung für Einsteiger (für FAQ)



  • Es fällt schwer, den Zusammenhang zwischen Zeigern und Objekten auf die gezeigt wird zu verstehen.
    Solange man das nicht verstanden hat, wirft man es gerne durcheinander und das verursacht Speicherfehler: Memoryleaks, Zugriffe auf NULL-Zeiger oder Zugriffe an Speicherstellen, wo nichts mehr ist.

    Ich versuche mir sowas an normalen Gegenständen vorzustellen:
    Ein Zeiger ist nur eine Adresse. Wie ein Zettel, wo du draufschreibst, wo dein Auto parkt. Das Auto ist ein Objekt.

    Du nimmst den Zettel und legst ihn auf den Tisch

    CAuto* pZettel;
    

    Nun weißt du nicht, was draufsteht. Es könnte ja noch eine Notiz von irgendwann mal drauf sein. Oder auch nix - das ist aber nur im Debugmodus der Fall.

    Also löscht man ihn.

    pZettel = NULL;
    

    z.B. alles wegradieren, wenn man mit Bleistift geschrieben hat.
    Wenn du nun draufguckst, weißt du, dass du kein Auto hast. Weil ja kein Parkplatz auf dem Zettel steht.
    Würdest du jetzt versuchen, loszufahren - du würdest auf dem Hintern landen oder dir stundenlang den Kopf zerbrechen, wie du das machen sollst. Du hast ja kein Auto. Deswegen stürzt dein Programm ab, wenn du auf einen NULL-Zeiger zugreifen willst.

    Also kaufst du dir ein neues Auto, das steht beim Händler.

    pZettel = new CAuto;
    

    Nun steht auf dem Zettel z.B. "Autohaus Meier, links neben dem Eingang".
    Jetzt hast du ein Auto, mit dem du losfahren kannst.

    Jetzt kommt dein Freund vorbei, findet den Zettel und überschreibt ihn mit dem Parkplatz seines Autos. "Dritter Parkplatz von links, gegenüber vom Haus"

    pZettel = pAutoVomFreund;
    

    Jetzt hast du keine Ahnung mehr, wo DEIN Auto steht und es ist verloren und wird auf immer und ewig auf dem Parkplatz stehen und vor sich hin rosten. 😃

    Schließlich hast du die Schnauze voll und verschrottest das Auto, auf das der Zettel verweist.

    delete pZettel;
    

    Nun hat dein Freund kein Auto mehr, der Parkplatz ist leer. Aber das Auto, was du gekauft hast steht immer noch beim Händler und rottet vor sich hin. Aber eigentlich weißt du von dem ja gar nix mehr - auf dem Zettel ist ja der leere Parkplatz vermerkt.
    Hier merkst du auch, warum es einen Absturz gibt, wenn kein Objekt hinter dem Zeiger ist. Versuch mal, mit dem Parkplatz loszufahren...
    Der Unterschied zu oben, wo du auf einen NULL-Zeiger zugegriffen hast, ist einfach. Oben wußtest du, dass du kein Auto hast - jetzt bist du aber felsenfest der Meinung, dass da auf dem Parkplatz ein Auto steht, mit dem du losfahren kannst.

    Also musst du noch kennzeichnen, dass du kein Auto mehr hast.

    pZettel = NULL;
    

    Jetzt ist der Zettel wieder leer und das Auto beim Autohaus Meier rostet vor sich hin...
    ...es ist ein Memoryleak

    Anmerkung für die Mods (bitte wegeditieren): Ich weiß nicht, in welche FAQ es soll. Entstanden ist es hier - aber es ist wohl reines C. Aber Objekte sind C++...
    Ordnet es bitte richtig ein, danke. 🙂



  • CAuto* pZettel = new CAuto;
    pZettel = pAnderesAuto;
    
    delete pZettel;
    

    Also wenn ich 'delete' ausführe, dann wird nicht das auf Codezeile 1 erzeugte Objekt gelöscht. Grund: Der Zeiger auf Zeile 2 wurde anderwertig zugewiesen. Verstehe ich das richtig so?



  • Ja, vollkommen richtig.




Anmelden zum Antworten