unterschied statisches und dynamisches Objekt



  • Hey Leute,

    was ist eignetlich der Unterschied zwischen einem
    1. statisch Objekt

    class A {...}
    A obj();
    

    2. dynamischen Objekt

    class A {...}
    A* obj = new A();
    

    Der einzige mir bekannte unterschied ist, dass ich ein dynamischens Objekt zur Laufzeit wieder löschen kann und den Objektnamen "obj" auch anderen Objekten zuweisen kann, gibt es noch mehr Unterschiede?

    Gruß



  • Das hat nix mit statisch und dynamisch zu tun.

    Im ersten Fall legst Du etwas auf dem Stack ab und es läuft durch automatische Speicherverwaltung mit RAII und RRID.

    Im zweiten Fall legst Du etwas auf dem Heap an. Dadurch kannst Du Dir aussuchen, wann Du es löscht und darüber hinaus dynamisch bestimmen, wie groß der anzulegende Speicher sein soll. Zusätzlich hast Du eine Indirektion über Zeiger, die manchmal praktisch sein kann, es aber seltener ist, als man glaubt.

    Um die Indirektion und mögliche Speicherfehler durch die Notwendigkeit des manuellen Aufräumens zu vermeiden ist Variante 1 immer zu bevorzugen, solange nicht triftige Gründe für Variante 2 sprechen.



  • 123ann schrieb:

    1. statisch Objekt

    class A {...}
    A obj();
    

    Dies ist kein "statisches" Objekt, zumindest sollte man in C++ sehr vorsichtig sein den Begriff statisch zu verwenden, da es zu Komplikationen mit dem Schlüsselwort "static" kommt.

    Zudem ist "A obj();" eine Funktionsdeklaration, das was du meinst ist "A obj;", eine Stackvariable. Eine Stackvariable wird automatisch beim Verlassen des Gültigkeitsbereiches (Scope) zerstört (Und das passiert auch zur Laufzeit).

    123ann schrieb:

    2. dynamischen Objekt

    class A {...}
    A* obj = new A();
    

    Hier handelt es sich um eine Zeigervariable die auf ein Objekt auf dem Heap verweist, der mit new alloziert wurde. Die Zeigervariable selbst liegt auf den Stack, und wird demzufolge am Ende des Gültigkeitsbereiches zerstört. Das Erzeugte Objekt bleibt aber bestehen, bis es explizit mit delete zerstört wurde.

    Ein Zeiger ist nichts anderes als ein Integerwert der eine Speicheradresse enthält, in so fern kann man natürlich leicht den Verweis ändern, in dem man den Inhalt mit einer anderen Adresse überschreibt.

    Grundsätzlich wird in C++ (gerade auch im Zusammenhang mit der C++ Standardbibliothek) tendenziell weniger mit Zeigern gearbeitet.


Anmelden zum Antworten