<list> in Verbindung mit Zeiger?!



  • Hallo,

    erstmal ein wenig Programmcode:

    class A
    {
    public:
        A() {}
        list<string> liste;
        f() {liste.clear();}
    };
    
    int main
    {
        A* inst = &A();
        inst->f(); //hier krach es beim debuggen
    
        return 0;
    }
    

    Warum kracht es hier (Compiler gibt keine Fehler aus!). Der Fehler tritt auf sobald auf die liste zugegriffen wird...

    Folgendermaßen funktioniert es. Aber warum funktioniert es nicht, wenn ich mit Zeigern arbeite?

    int main
    {
        A inst = A();
        inst.f(); 
    
        return 0;
    }
    

    Grüße,
    nooby



  • Weil

    A* inst = &A()
    

    ;

    Ein temporäres A anlegt, dein Zeiger speichert unbd das Objekt wieder löscht.

    So wäre es korrekt:

    A inst;
    A* inst_ptr = &inst;
    


  • A* inst = new A;
    

    Mit Zeiger speicher reservieren. Und delete nicht vergessen.



  • Absolute_nooby schrieb:

    Hallo,

    erstmal ein wenig Programmcode:

    class A
    {
    public:
        A() {}
        list<string> liste;
        f() {liste.clear();}
    };
    
    int main
    {
        A* inst = &A();
        inst->f(); //hier krach es beim debuggen
    
        return 0;
    }
    

    Warum kracht es hier (Compiler gibt keine Fehler aus!). Der Fehler tritt auf sobald auf die liste zugegriffen wird...

    Folgendermaßen funktioniert es. Aber warum funktioniert es nicht, wenn ich mit Zeigern arbeite?

    int main
    {
        A inst = A();
        inst.f(); 
    
        return 0;
    }
    

    Grüße,
    nooby

    Weil hier

    A inst = A();
    ein Objekt der Klasse A angelegt wird.

    hier
    A inst = &A();*
    aber nicht.

    Der korrekte Code würde so aussehen:
    A *inst = new A();



  • Aufpasser schrieb:

    A inst = A();
    ein Objekt der Klasse A angelegt wird.

    Werden nicht sogar zwei Objekte angelegt? Schließlich bedeutet obiges doch auch nur A inst(A()); , d.h. der Copy Kontruktor wird für inst mit dem temporären Objekt A() aufgerufen?



  • HighLigerBiMBam schrieb:

    A* inst = new A;
    

    Mit Zeiger speicher reservieren. Und delete nicht vergessen.

    Inwiefern delete nutzen?



  • Wenn du das Objekt wieder entsorgen willst, welches du mit "new" erzeugt hast, musst du "delete" benutzen



  • A* ptr = new A();
    // *ptr benutzen
    delete ptr;
    // *ptr nicht mehr benutzen
    


  • hier aber nicht.

    Doch, es wird eins erzeugt, das aber seinen Gültigkeitsbereich direkt nach der Zuweisung verliert und deshalb den ungültigen Pointer hinterlässt.

    Und warum hier mit new rumgefuchtelt wird ist mir unverständlich. Einfach das Objekt auf dem Stack erstellen und per Addressoperator die Addresse dem Zeiger zuweisen.



  • Mir wäre schleierhaft, warum du eine unnötige Indirektion durch pointer für dein Stackelement benötigst.



  • Muss ich grundsätzlich Objekte, die ich mit new erzeugt habe, wieder mit delete entfernen?

    Müsste ich auch Objekte die ich per

    A inst = A();
    

    erzeuge, ebenfalls per delete explizit löschen?
    Gibt es keinen "Carbage Collector" wie in C#?



  • Es gibt keinen Garbagecollector. -> Was man erschafft muss man zerstören. Objekte auf dem Stack werden zerstört, wenn der Scope des Objektes verlassen wird.

    A inst = A(); //nicht gut
    A inst(); //gut
    


  • HighLigerBiMBam schrieb:

    A inst = A(); //nicht gut
    

    Gut. ⚠

    HighLigerBiMBam schrieb:

    A inst(); //gut
    

    Nicht gut. ⚠



  • A inst;
    

    besser 😉



  • Das kaufe ich dir nicht ab. Die zwei Klammern sind bei default konstruktor zuviel, aber "A inst(...);" ist definitiv besser.



  • HighLigerBiMBam schrieb:

    Das kaufe ich dir nicht ab. Die zwei Klammern sind bei default konstruktor zuviel, aber "A inst(...);" ist definitiv besser.

    T foo(); ist aber leider eine Funktionsdeklaration.



  • HighLigerBiMBam schrieb:

    aber "A inst(...);" ist definitiv besser.

    Kann sein. Muss nicht.

    Aber im Zusammenhang mit der Aussage "Was man erschafft muss man zerstören. Objekte auf dem Stack werden zerstört, wenn der Scope des Objektes verlassen wird." zu sagen, dass A inst = A(...) nicht gut wäre, erweckt einen falschen Eindruck davon, was bei dieser Deklaration geschieht.



  • fdfdg schrieb:

    HighLigerBiMBam schrieb:

    Das kaufe ich dir nicht ab. Die zwei Klammern sind bei default konstruktor zuviel, aber "A inst(...);" ist definitiv besser.

    T foo(); ist aber leider eine Funktionsdeklaration.

    Sorry, Unsinn, hab falsch gelesen..



  • Gut ich gebe zu, es war zusammenhangslos...



  • So nun bin ich verwirrt^^.

    1.Wenn ich etwas auf dem Stack erzeuge, wird dieses automatisch gelöscht. Also brauche ich mich hier um das Entfernen nicht selber kümmern...?! Wie erzeuge ich Objekte auf dem Stack?

    A inst();
    

    kenne ich nicht... Was bedeutet das? Erzeugt dies ein Objekt per Standardkonstruktor?


Log in to reply