Objekt instanziieren



  • Hallo,

    ich bin dabei C++ zu lernen und hab eine Frage zum erstellen eines Objektes. Meines Wissens nach gibt es 2 Möglichkeiten:

    Objekt *obj = new Objekt("abc");
    Objekt obj2 = Objekt("abc");
    

    Erstmal stimmt das? Und was meine eigentlich Frage ist: Welchen Sinn hat es, wenn ich mit new den Zeiger auf das Objekt statt das eigentliche Objekt verwende? Entstehen daraus irgendwelche Vor-/Nachteile?

    danke für die Hilfe!



  • Die übliche Methode wäre eher:

    Objekt obj("abc");
    

    Das mit dem = kann aber auch gehen. Das new hat nur Nachteile. Das Objekt wird damit auf dem Heap und nicht auf dem Stack erstellt. Speicheranforderungen an den Heap sind aber langsam. Zudem musst du dich noch um das Löschen des Objekts kümmern, mit new angeforderter Speicher wird nicht automatisch wieder freigegeben.
    Der Heap hat halt den Vorteil, dass du wesentlich mehr Speicher reservieren kannst. (Der Stack ist üblicherweise ~1MB groß, auf dem Heap ist in etwa so viel frei, wie das System RAM hat.)
    Trotzdem legt man Objekte selbst eigentlich immer auf dem Stack an. Wenn du viel Speicher brauchst, regel das über Container, die reservieren auf dem Heap. (Und geben automatisch wieder frei.)
    Container wären z.B. std::vector, std::string, std::list, etc.
    Falls du doch mal das new brauchen solltest (Polymorphie ist da ein Stichwort), verwende ruhig so genannte Smart-Pointer. Die geben den Speicher dann auch automatisch wieder frei. shared_ptr und unique_ptr wären da Kandidaten. (auto_ptr ist veraltet.)



  • danke für die schnelle und hilfreiche Antwort!


  • Mod

    I3ilbo schrieb:

    Erstmal stimmt das?

    Ja. Es gibt auch noch die Möglichkeit, konstante Objekte zur Compilezeit zu haben.

    Und was meine eigentlich Frage ist: Welchen Sinn hat es, wenn ich mit new den Zeiger auf das Objekt statt das eigentliche Objekt verwende?

    Das brauchst du dann, wenn du ganz spezielle Anforderungen an die Lebenszeit eines Objektes hast, die du durch die automatischen Stackobjekte nicht erreichen kannst. Und bei gewissen Organisationsformen von polymorphem Verhalten macht man das auch so.

    Entstehen daraus irgendwelche Vor-/Nachteile?

    Das new hat jede Menge Nachteile und sollte daher nur benutzt werden, wenn einer der obigen Gründe auftritt. Es ist wesentlich langsamer und erfordert größeren Programmieraufwand. Den zusätzlichen Programmieraufwand kannst (und solltest!) du in Grenzen halten, indem du keine rohen Zeiger benutzt, sondern smarte Pointer oder Containerklassen die das RAII-Prinzip benutzen.

    edit: Zweifach zu spät...



  • cooky451 schrieb:

    Das new hat nur Nachteile.

    Besser wäre eher die Aussage das man new nur benutzen sollte wenn man es wirklich benötigt, aber das new nur Nachteile hat stimmt nicht (Zumal du selbst einen Vorteil des Heaps erwähnst). Die Aussage so wie sie ist, ist jedenfalls falsch.


Anmelden zum Antworten