Ich habe gerade die neue Bedienererklärung auf cplusplus.com gelesen. Die Seite zeigt ein Beispiel, um vier verschiedene Arten der Verwendung eines neuen Operators wie folgt zu demonstrieren:
%Vor%Meine Fragen sind:
myclass* p3 = new myclass
äquivalent zu myclass* p3 = new myclass()
? Weil sie unterschiedliche Zwecke haben. Wenn Sie nicht möchten, dass new
std::bad_alloc
bei einem Fehler ausgibt, würden Sie nothrow
verwenden. Wenn Sie Ihre Objekte im vorhandenen Speicher reservieren möchten, verwenden Sie das Placement new ... Wenn Sie rohen, nicht initialisierten Speicher wünschen, würden Sie operator new
direkt aufrufen und das Ergebnis auf den Zieltyp anwenden.
Die einfache Standardverwendung von new
in 99% aller Fälle ist MyClass* c = new MyClass()
;
Zu Ihrer zweiten Frage: Die Formulare new Object()
vs new Object
sind im Allgemeinen nicht gleich. Siehe diese Frage und die Antworten für die Details. Aber das wirklich ist pingelig. Normalerweise sind sie gleichwertig, aber um auf der sicheren Seite zu sein, wählen Sie immer new Object()
; Beachten Sie, dass sie in diesem speziellen Beispiel gleich sind, da MyClass
keine Mitglieder hat, also lautet die Antwort auf Ihre Frage streng genommen ja.
1) Einige davon werden nur in bestimmten, ungewöhnlichen Situationen verwendet. Die einfache alte traditionelle ist die beste, die meiste Zeit sowieso:
%Vor%2) Ja, das sind sie. Wenn der Konstruktor keine Argumente hat, sind die Klammern optional. Wenn Sie eine automatische Variable deklarieren - d. H.
%Vor% dann müssen Sie müssen die Klammern weglassen, oder es ist eine Funktionsdeklaration! Daher werden viele Leute Ihnen sagen, dass Sie sie auch im new
-Ausdruck weglassen sollen. Das ist eine gute Übung, denke ich, aber ich bin nur daran gewöhnt, sie einzubeziehen.
Statt "best practice" brauchen Sie sie in verschiedenen Situationen. Zum Beispiel möchten die meisten Leute nur new x()
aufrufen, um etwas Speicher zuzuordnen und das Objekt zu erstellen. Manchmal befinden Sie sich jedoch in Situationen, in denen keine Ausnahme ausgelöst werden soll, falls new
fehlschlägt. Daher rufen Sie stattdessen new (nothrow)
auf, um eine Null zurück zu erhalten.
Wenn Sie bereits etwas Speicher zugewiesen haben, aber ein Objekt erstellen müssen, verwenden Sie "placement new", indem Sie new (p3) x
aufrufen.
In dem seltenen Fall, in dem Sie den Speicherzuordner einer Klasse verwenden, aber kein Objekt erstellen müssen, verwenden Sie die (myclass*) operator new (sizeof(myclass))
-Syntax.
Hier sind meine Empfehlungen:
new
; Vorbeigehen
Referenz wenn möglich. (Vermeidet Speicherlecks). operator new
: x = new X(); // Remember to use delete
std::vector
dem Array new
vorziehen:
%Code%
x = new X()[quantity]; // Remember to use delete []
außer
Sie kennen die Gründe absolut. Im Allgemeinen wird das Placement new zur Zuweisung von bestimmten Adressen oder einem speziellen Speicherpool verwendet. Dies ist ein fortgeschrittenes Thema.
Tags und Links c++ new-operator pointers