<list> in Verbindung mit Zeiger?!



  • 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?



  • fdfdg schrieb:

    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..

    Wieso Unsinn - natürlich ist das eine Funktionsdeklaration und erstellt mit Sicherheit kein Objekt.



  • is doch korrekt schrieb:

    fdfdg schrieb:

    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..

    Wieso Unsinn - natürlich ist das eine Funktionsdeklaration und erstellt mit Sicherheit kein Objekt.

    Ja, aber ich hab HighLigerBiMBams "Die zwei Klammern sind bei default konstruktor zuviel" überlesen, wollte ihm halt widersprechen.



  • Da ich für die Verwirrung schuld bin:

    A mystackobject = A(); //Stack
    A mystackobject; //Stack
    A *mypointer = new A; //Heap
    

    Mit new wird auf dem Heap erzeugt, sonst auf dem Stack. Das heißt aber nicht, dass wenn du ein Objekt auf dem Stack erzeugt, dies keine Member auf dem Heap anlegen kann. In jedem Fall sollten aber Objekte sich selbst aufräumen.

    T foo(); //ist eine Funktionsdeklaration.
    


  • Absolute_nooby schrieb:

    class A
    ...
    
    int main
    {
        A* inst = &A();
        inst->f(); //hier krach es beim debuggen
    

    C++ erlaubt dir nicht, die Adresse eines temporären Objekts zu holen. Das ist auch gut so, denn das temporäre Objekt "stirbt" quasi "mit dem Semikolon" (nachdem der vollständige Ausdruck ausgewertet worden ist). Ich würde die nicht-Standard-Erweiterungen Deines Compilers ausschalten und die Warn-Stufe erhöhen.


Anmelden zum Antworten