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>
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):
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.
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.
Tags und Links c++ new-operator