Unterschied zwischen globalem Nicht-Werfen ::operator new und std::malloc

Lesezeit: 3 Minuten

Unterschied zwischen globalem Nicht Werfen operator new und stdmalloc
gha.st

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.

Unterschied zwischen globalem Nicht Werfen operator new und stdmalloc
Fred Foo

Die Hauptunterschiede, abgesehen von Syntax und free vs. delete, sind

  1. du kannst portabel ersetzen ::operator new;
  2. malloc kommt mit realloc, für die new hat kein Äquivalent;
  3. 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.)

  • @gha.st Wenn nichts anderes, dann die Tatsache, dass es ::std::malloc und du darfst keine eigenen Namen hinzufügen ::std sofern dies nicht ausdrücklich erlaubt ist.

    – Angew ist nicht mehr stolz auf SO

    24. Apr. ’14 um 14:26


  • Huh, ersetzen ::operator new so ist das ziemlich funky

    – gha.st

    24. April ’14 um 14:30 Uhr

  • Einige Untersuchungen zeigen, dass C++03 bereits das Konzept eines new_handler (§18.4.2) enthält, es wurde nur für C++11 erweitert

    – gha.st

    24. Apr. ’14 um 14:33

  • (4) malloc meldet Fehler als Nullzeigerergebnis, operator new meldet Fehler über Ausnahme, (5) malloc wird direkt per Benutzercode aufgerufen, operator new wird normalerweise indirekt über ein transaktionsähnliches . aufgerufen new Ausdruck, der Zuweisung und Initialisierung koppelt.

    – Prost und hth. – Alf

    29. Apr. ’14 um 23:06

  • @Cheersandhth.-Alf Die Frage dreht sich um das Nicht-Werfen new.

    – Fred Foo

    30. Apr. ’14 um 8:56

Mir fallen da zwei Unterschiede ein:

  1. Welche Funktion müssen Sie verwenden, um den Speicher freizugeben, operator delete vs. free().

  2. 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.

  • Soweit ich weiss malloc ist ein schwaches Symbol, was bedeutet, dass Sie es überschreiben können.

    – Zaffy

    25. Apr. ’14 um 22:59


  • @Zaffi Das hängt ganz von der Implementierung ab (Compiler & Standardbibliothek, in diesem Fall auch Linker). Soweit standardmäßiges, portables C++ betroffen ist, ist dies nicht möglich.

    – Angew ist nicht mehr stolz auf SO

    26. April ’14 um 6:41

1641784183 109 Unterschied zwischen globalem Nicht Werfen operator new und stdmalloc
gd1

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.

  • Werfen Sie einen Blick auf die Version von new, die eine ::std::nothrow& als zweiter Parameter

    – gha.st

    24. Apr. ’14 um 14:20

.

266100cookie-checkUnterschied zwischen globalem Nicht-Werfen ::operator new und std::malloc

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy