Warum gibt es so viele verschiedene Möglichkeiten, einen neuen Operator in C ++ zu verwenden?

8

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:

  1. Was ist die beste Anwendung? neuer Betreiber?
  2. Ist myclass* p3 = new myclass äquivalent zu myclass* p3 = new myclass() ?
xiao 啸 13.05.2011, 17:34
quelle

4 Antworten

6

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.

    
Alexander Gessler 13.05.2011, 17:39
quelle
2

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.

    
Ernest Friedman-Hill 13.05.2011 17:39
quelle
0

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.

    
Gabe 13.05.2011 17:42
quelle
0

Hier sind meine Empfehlungen:

  1. Verwenden Sie nicht new ; Vorbeigehen Referenz wenn möglich. (Vermeidet Speicherlecks).
  2. Verwende operator new : x = new X(); // Remember to use delete
  3. Lieber std::vector dem Array new vorziehen: %Code%
  4. Verwenden Sie nicht Platzierung 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.

    
Thomas Matthews 13.05.2011 17:45
quelle

Tags und Links