C++ verfügt über mehrere Funktionen, um dynamischen Speicher zu erhalten, von denen sich die meisten grundlegend unterscheiden. Mehrere weitere werden normalerweise vom Betriebssystem hinzugefügt.
Zwei davon sind aufgrund ihrer Portabilität und Ähnlichkeit von besonderem Interesse: malloc
und ::operator new
.
Gibt es Unterschiede (in Bezug auf Standard und Implementierung) zwischen den globalen void* operator new(size_t, ::std::nothrow&)
und void* malloc(size_t)
?
Da es einige Verwirrung zu geben scheint, wovon ich spreche, betrachten Sie die folgenden beiden Aufrufe:
void* p = ::std::malloc(10);
void* q = ::operator new(10, ::std::nothrow);
Der offensichtliche und triviale Unterschied besteht darin, wie der Speicher freigegeben wird:
::std::free(p);
::operator delete(q);
Hinweis: Diese Frage ist kein Duplikat von zB Was ist der Unterschied zwischen new/delete und malloc/free? da es um die Verwendung der . geht global operator new
das führt eigentlich keine ctor-Aufrufe durch.
Die Hauptunterschiede, abgesehen von Syntax und free
vs. delete
, sind
- du kannst portabel ersetzen
::operator new
;
malloc
kommt mit realloc
, für die new
hat kein Äquivalent;
new
hat den Begriff a new_handler
, für die es kein . gibt malloc
gleichwertig.
(Ersetzen malloc
öffnet sich Dose Würmer. Dies ist möglich, jedoch nicht portabel, da die Kenntnis des Linkers erforderlich ist.)
Mir fallen da zwei Unterschiede ein:
-
Welche Funktion müssen Sie verwenden, um den Speicher freizugeben, operator delete
vs. free()
.
-
Ein C++-Programm kann legal seine eigene Version von . bereitstellen ::operator new
und diese Version wird garantiert aufgerufen von new
Ausdrücke. Überschreiben ist nicht möglich malloc
mit Ihrer eigenen Version.
Der makroskopische Unterschied, den ich ohne weitere Recherchen feststellen kann, besteht darin, dass die Wurfvariante des globalen ::new
Operator wirft std::bad_alloc
wenn die Zuweisung nicht möglich ist, während malloc
kehrt zurück NULL
. Aber ich glaube, die meisten der hier aufgeführten Unterschiede gelten für die globale ::new
Betreiber, auch wenn es um das Thema geht new
.
.