Was macht der neue C ++ - Operator außer der Zuweisung und einem ctor-Aufruf?

8

Was sind alles andere Dinge, die der new -Operator tut, außer Speicher zuzuweisen und einen Konstruktor aufzurufen?

    
yesraaj 18.12.2008, 08:16
quelle

3 Antworten

16

Der C ++ - Standard sagt Folgendes über das einzelne Objektformular (das Formular, das normalerweise verwendet wird) des neuen Operators aus dem Header <new> :

  

Erforderliches Verhalten:

     

Geben Sie einen Nonnull-Zeiger auf den entsprechend ausgerichteten Speicher (3.7.3) zurück, oder werfen Sie einen anderen   bad_alloc Ausnahme. Diese Anforderung ist für eine Ersatzversion dieser Funktion bindend.

     

Standardverhalten:

     

- Führt eine Schleife aus: Innerhalb der Schleife versucht die Funktion zuerst, den angeforderten Speicher zuzuweisen. Ob   der Versuch beinhaltet einen Aufruf an die Standard-C-Bibliothek Funktion malloc ist nicht spezifiziert.

     

- Gibt einen Zeiger auf den zugewiesenen Speicher zurück, wenn der Versuch erfolgreich ist. Andernfalls, wenn das letzte Argument zu   set_new_handler () war ein Null-Zeiger, wirf bad_alloc.

     

- Andernfalls ruft die Funktion den aktuellen new_handler (18.4.2.2) auf. Wenn die aufgerufene Funktion zurückkehrt, die Schleife   wiederholt sich.

     

- Die Schleife wird beendet, wenn ein Versuch, den angeforderten Speicher zuzuordnen, erfolgreich war oder wenn ein Aufruf erfolgte   Die Funktion new_handler kehrt nicht zurück.

Der Standard hat eine Menge anderer Dinge über den neuen Operator und die dynamische Speicherzuweisung zu sagen (eine Menge zu sagen), aber ich denke, die Liste "Standardverhalten" fasst die Grundlagen des neuen Betreibers ziemlich gut zusammen / p>     

Michael Burr 18.12.2008, 08:33
quelle
9

Ich habe eine Erklärung dafür verfasst, was es in diese Antwort. Es erklärt, wie

  • new erhält den Speicher
  • new behandelt Speicherfehler
  • new behandelt Konstruktorausnahmen
  • new behandelt spezielle Platzierungs- und Notch-Versionen

Michael hat erklärt, wie die Standard-Zuweisungsfunktion (:: operator new) Speicher gut bekommt und wie sie Fehler behandelt. Ich habe Ihre Frage nach der Größe eines Objekts in seinen Kommentaren gesehen. Die Antwort ist, dass keine Größe gespeichert wird, wenn nicht notwendig. Denken Sie daran, dass C die Größe für free nicht benötigt (und :: operator new kann einfach malloc verwenden):

%Vor%

Hier ist ein Beispiel, in dem Sie sehen, wie sich das Speichern der Größe auf die Größe der Zuweisung für die Array-Form eines neuen Ausdrucks auswirkt (nicht in meiner anderen Antwort enthalten):

%Vor%

Es wird so etwas gedruckt:

%Vor%

Ein Byte für das Objekt selbst und 4 Byte für den Zählwert, der unmittelbar vor dem zugewiesenen Bereich des Objekts gespeichert wird. Wenn wir nun die Deallocation-Funktion ohne einen Size-Parameter verwenden (indem wir sie einfach aus dem Operator delete entfernen), erhalten wir diese Ausgabe:

%Vor%

Die C ++ - Laufzeit kümmert sich hier nicht um die Größe, also speichert sie sie nicht mehr. Beachten Sie, dass dies in hohem Maße implementierungsspezifisch ist und dass gcc hier die Größe im Member-Operator löschen kann. Andere Implementierungen können die Größe noch speichern und werden höchstwahrscheinlich einen Destruktor für die Klasse aufrufen. Wenn Sie beispielsweise ~f() { } hinzufügen, wird gcc zum Speichern der Größe verwendet, unabhängig davon, welche Deallokationsfunktion wir schreiben.

    
Johannes Schaub - litb 24.12.2008 01:37
quelle
0

Hängt davon ab, ob es überladen ist oder nicht, ob Sie die App zum Debuggen gebaut haben, ob Sie einen Speicherleckdetektor verwenden, ob Sie ein Speicherpoolschema haben, ob Sie etwas wie den Boehm Garbage Collector haben / Markierungen aufheben, usw., usw. Es könnte eine Menge von benutzerdefinierten Sachen drin sein, oder nichts besonderes.

    
Michel 18.12.2008 08:25
quelle

Tags und Links