Fragen zu Zeigern.



  • Entweder die Leute sind von Java nach C++ umgestiegen (in Java muß man Objekte mit new anlegen) oder sie wollen das Objekt etwas länger verwenden als in der Funktion, die es angelegt hat (lokale Variablen werden zerstört, wenn ihr Scope verlassen wird).



  • Habt Ihr Euch abgesprochen oder wieso taucht diese Woche dauernd die Frage "wofür Zeiger" auf?

    Mein Vorschlag: Benutze solange es geht keine Zeiger, es wird irgendwann der Tag kommen, an dem Du die Lebensdauer eines Objektes nicht mehr fest an einen Block binden kannst. Dann wirst Du schon lernen, wofür man Zeiger manchmal eben doch verwenden muss - oder Du liest die anderen Threads zu dem Thema durch 😉



  • 🙂
    Leider habe ich mit den Stichwoertern "Zeiger" "Zweck Zeiger" und sogar "Wofuer Zeiger" keinen Beitrag finden koennen, der sich mit meiner Frage beschaeftigt.

    @CStoll

    ...oder sie wollen das Objekt etwas länger verwenden als in der Funktion, die es angelegt hat (lokale Variablen werden zerstört, wenn ihr Scope verlassen wird).

    Koenntest du das vielleicht bitte mit einem Codebeispiel erklaeren...? Wie es waere mit Zeigern <-> Wie es waere ohne Zeiger... Danke! 🙂

    A-jage



  • Dann nimm doch auch mal "Pointer" in deine Suchbegriffe auf 😉

    (für Erklärungen über den Sinn von Zeigern empfehle ich mal GPC's Magazin-Artikel "Pointer in C(++)")



  • void funktion()
    {
       Objekt o; // am ende dieser Funktion wird o zerstört
       Objekt* p = new Objekt(); // dieses Objekt bleibt am Leben, man braucht nur einen Zeiger darauf um damit zu arbeiten
    }
    


  • Kenner der Zeiger schrieb:

    void funktion()
    {
       Objekt o; // am ende dieser Funktion wird o zerstört
       Objekt* p = new Objekt(); // dieses Objekt bleibt am Leben, man braucht nur einen Zeiger darauf um damit zu arbeiten
    }
    

    Eine Anmerkung zur zweiten Zeile: Der Zeiger 'p' wird am Ende der Funktion natürlich auch gelöscht, lediglich das (mit new erzeugte) Objekt, auf das er zeigt, bleibt bestehen - und wenn du seine Adresse nicht anderweitig speicherst, wirst du nach Ende der Funktion nichts mehr mit dem Objekt machen können.
    (das nennt sich dann "Speicherleck")



  • Doch was für Folgen hat dieses "Zertören" für das weitere Arbeiten..?

    Ich meine, man kann doch noch immer auf die Elementvariablen und Elementmethoden zugreifen oder nicht...?

    A-jage



  • Nein. Der this-Zeiger wird ungültig nachdem der Destruktor aufgerufen wurde.


  • Mod

    (D)Evil schrieb:

    Nein. Der this-Zeiger wird ungültig nachdem der Destruktor aufgerufen wurde.

    Genau genommen bleibt der Zeiger gültig, kann aber nur eingeschränkt benutzt werden - bis an der gleichen Stelle wieder ein Objekt gleichen Typs lebt. this wird ungültig - also singulär, sobald der gleiche Speicher für andere Zwecke verwendet ("reused" in standardesisch - IMO allerdings etwas unklar in seiner Bedeutung) oder freigegeben wird - aus diesem Grunde ist es erlaubt, dass der Compiler bei einem delete p den Wert des Zeigers p verändert (der Zeiger darf ohnehin nicht gelesen werden) - das kann beim Debuggen helfen.



  • a-jage schrieb:

    Doch was für Folgen hat dieses "Zertören" für das weitere Arbeiten..?

    Ich meine, man kann doch noch immer auf die Elementvariablen und Elementmethoden zugreifen oder nicht...?

    A-jage

    Der Zeiger wird nicht zerstört, er ist halt nur in der Funktion gültig, weil er dort deklariert wurde.
    Und ja, du kannst noch drauf zugreifen, aber du kennst ja die Adresse nicht, weil du auf p nicht zugreifen kannst, weil die Variable nur innerhalb der Methode gültig ist.
    Aber ums mit meinen Worten zu erklären:
    Ein Zeiger "zeigt" auf eine Speicherstelle. Diese kann auch ungültig sein (NULL).
    Ein Zeiger ist nur innerhalb seines Bereiches gültig. (Klasse, Methode, global)
    Solange der Speicherbereich nicht freigegeben wird (delete), bleibt der Speicherbereich gültig. Man muss nur die Adresse kennen.
    rya.



  • Ok. Jetzt habe ich es wirklich verstanden, :):)

    THX


Anmelden zum Antworten