Wann soll man “neu” verwenden und wann nicht, in C ++?

Mögliche Duplikate:
Wann sollte ich das neue Schlüsselwort in C ++ verwenden?

Wann sollte ich den “new” -Operator in C ++ verwenden? Ich komme von C # / Java-Hintergrund und die Instanziierung von Objekten ist für mich verwirrend.

Wenn ich eine einfache class mit dem Namen “Point” erstellt habe, sollte ich beim Erstellen eines Punktes Folgendes tun:

Point p1 = Point(0,0); 

oder

 Point* p1 = new Point(0, 0); 

Kann jemand für mich klären, wann er den neuen Operator benutzen soll und wann nicht?

Duplikat von:

Wann sollte ich das neue Schlüsselwort in C ++ verwenden?

Verbunden:

Über Konstruktoren / Destruktoren und neue / lösche Operatoren in C ++ für benutzerdefinierte Objekte

Richtige Stapel- und Heap-Verwendung in C ++?

    Sie sollten new wenn ein Objekt so lange bestehen bleiben soll, bis Sie es delete . Wenn Sie new nicht verwenden, wird das Objekt zerstört, wenn es den Gültigkeitsbereich verlässt. Einige Beispiele dafür sind:

     void foo() { Point p = Point(0,0); } // p is now destroyed. for (...) { Point p = Point(0,0); } // p is destroyed after each loop 

    Einige Leute werden sagen, dass die Verwendung von new entscheidet, ob sich Ihr Objekt auf dem Heap oder dem Stack befindet, aber das gilt nur für Variablen, die in functionen deklariert sind.

    Im folgenden Beispiel befindet sich die Position von ‘p’ dort, wo das zugehörige Objekt Foo zugeordnet ist. Ich ziehe es vor, diese “In-Place” -Zuweisung zu nennen.

     class Foo { Point p; }; // p will be automatically destroyed when foo is. 

    Das Zuweisen (und Freigeben) von Objekten unter Verwendung von new ist viel teurer, als wenn sie direkt zugewiesen werden, so dass ihre Verwendung auf das Notwendige beschränkt sein sollte.

    Ein zweites Beispiel für die Zuweisung über new ist für Arrays. Sie können die Größe eines In-Place- oder Stack-Arrays zur Laufzeit nicht ändern. Wenn Sie also ein Array unbestimmter Größe benötigen, muss es über new zugewiesen werden.

    Z.B

     void foo(int size) { Point* pointArray = new Point[size]; ... delete [] pointArray; } 

    (* preemptive nitpicking – Ja, es gibt Erweiterungen, die Stapelzuweisungen in variablen Größen erlauben).

    Werfen Sie einen Blick auf diese Frage und diese Frage für einige gute Antworten auf C ++ Objekt Instanziierung.

    Diese Grundidee besteht darin, dass Objekte, die auf dem Heap (mit new) instanziiert wurden, manuell bereinigt werden müssen. Die auf dem Stack instanziierten Objekte (ohne new) werden automatisch bereinigt, wenn sie den Gültigkeitsbereich verlassen.

     void SomeFunc() { Point p1 = Point(0,0); } // p1 is automatically freed void SomeFunc2() { Point *p1 = new Point(0,0); delete p1; // p1 is leaked unless it gets deleted } 

    Sie sollten new verwenden, wenn Sie möchten, dass ein Objekt auf dem Heap und nicht auf dem Stapel erstellt wird. Dies ermöglicht den Zugriff auf ein Objekt von außerhalb der aktuellen function oder Prozedur mit Hilfe von pointersn.

    Es könnte für Sie nützlich sein, pointers und Speicherverwaltung in C ++ nachzuschlagen, da dies Dinge sind, auf die Sie in anderen Sprachen wahrscheinlich nicht gestoßen sind.

    New wird immer verwendet, um dynamischen Speicher zuzuweisen, der dann freigegeben werden muss.

    Mit der ersten Option wird dieser Speicher automatisch freigegeben, wenn der Bereich verloren geht.

     Point p1 = Point(0,0); //This is if you want to be safe and don't want to keep the memory outside this function. Point* p2 = new Point(0, 0); //This must be freed manually. with... delete p2;