Was ist der Unterschied zwischen new/delete und malloc/free?

Lesezeit: 7 Minuten

Was ist der Unterschied zwischen newdelete und mallocfree
HerrDatenbank

Was ist der Unterschied zwischen new/delete und malloc/free?

Verwandte (Duplikat?): In welchen Fällen verwende ich malloc vs. neu?

  • Siehe auch meine ausführliche Antwort hier.

    – Jonathan H

    24. Dezember 2014 um 12:19 Uhr

new / delete

  • Speicher zuweisen / freigeben
    1. Vom ‘Free Store’ zugewiesener Speicher.
    2. Gibt einen vollständig typisierten Zeiger zurück.
    3. new (Standardversion) gibt niemals a zurück NULL (Wird bei Fehler werfen).
    4. Werden mit Type-ID aufgerufen (Compiler berechnet die Größe).
    5. Verfügt über eine Version, die explizit Arrays behandelt.
    6. Neuzuweisung (um mehr Platz zu bekommen) nicht intuitiv gehandhabt (wegen Kopierkonstruktor).
    7. Ob sie anrufen malloc / free ist die Implementierung definiert.
    8. Kann einen neuen Speicherzuordner hinzufügen, um mit wenig Speicher umzugehen (std::set_new_handler).
    9. operator new / operator delete kann rechtlich überschrieben werden.
    10. Konstruktor / Destruktor zum Initialisieren / Zerstören des Objekts.

malloc / free

  • Speicher zuweisen / freigeben
    1. Von ‘Heap’ zugewiesener Speicher.
    2. Gibt ein void*.
    3. Kehrt zurück NULL auf Versagen.
    4. Muss die erforderliche Größe in Byte angeben.
    5. Das Zuweisen eines Arrays erfordert eine manuelle Berechnung des Speicherplatzes.
    6. Einfaches Neuzuweisen eines größeren Teils des Speichers (kein Kopierkonstruktor, um den man sich Sorgen machen muss).
    7. Sie werden NICHT Anruf new / delete.
    8. Keine Möglichkeit, Benutzercode in die Zuordnungssequenz einzufügen, um bei wenig Arbeitsspeicher zu helfen.
    9. malloc / free kann NICHT rechtlich außer Kraft gesetzt werden.

Tabellenvergleich der Features:

Feature new / delete malloc / free
Speicher zugewiesen von ‘Kostenloser Laden’ ‘Haufen’
Kehrt zurück Vollständig typisierter Zeiger void*
Beim Scheitern Wirft (kehrt nie zurück NULL) Kehrt zurück NULL
Erforderliche Größe Vom Compiler berechnet Muss in Bytes angegeben werden
Umgang mit Arrays Hat eine explizite Version Erfordert manuelle Berechnungen
Umverteilung Nicht intuitiv gehandhabt Einfach (kein Kopierkonstruktor)
Rückruf Umsetzung definiert Nein
Fälle mit wenig Speicher Kann einen neuen Speicherzuordner hinzufügen Wird nicht vom Benutzercode behandelt
Überschreibbar Jawohl Nein
Verwendung von Konstruktor / Destruktor Jawohl Nein

Technisch gesehen wird Speicher von zugewiesen new stammt aus dem ‘Free Store’, während der Speicher von zugewiesen wird malloc kommt vom ‘Haufen’. Ob diese beiden Bereiche gleich sind, ist ein Implementierungsdetail, was ein weiterer Grund dafür ist malloc und new kann nicht gemischt werden.

  • Kann jemand den “Free Store” im Gegensatz zum Haufen bearbeiten, um näher darauf einzugehen? Der Heap eines Prozesses ist ein bekanntes sprachunabhängiges (?) Konzept auf Betriebssystemebene; Woher kommt der “Free Store”?

    – einpoklum

    21. Februar 2016 um 15:26 Uhr

  • @einpoklum: Sie sind nur Namen von Speicherbereichen. Beides hat nichts mit dem als “heap” bekannten Sprachkonzept oder dem os-Konzept von “processes heap” zu tun. C++ ist bewusst plattform-/betriebssystem-/compilerneutral definiert. Die Verwendung eines spezifischen Betriebssystemkonzepts wie „Processes Heap“ würde also die Flexibilität des Standards untergraben.

    – Martin York

    21. Februar 2016 um 17:06 Uhr


  • @winterlight: Früher war das so, aber nicht mehr. Sehen: linux.die.net/man/3/free If ptr is NULL, no operation is performed.

    – Martin York

    19. Juni 2016 um 17:12 Uhr

  • @LokiAstari Es sieht so aus, als wären “Heap”, “Free Store” und “Dynamic Memory/Storage” Synonyme: In Bjarne Stroustrup’s Eine Tour durch C++sagt er “Die new Operator weist Speicher aus dem zu kostenlos speichern (auch bekannt als dynamisches Gedächtnis und Haufen). Der C++ 14 Standard, Abschnitt 3.7.4 ff Dynamischer Speicher sagt: “Objekte können dynamisch während der Programmausführung (1.9) mit neuen Ausdrücken (5.3.4) erstellt und mit Löschausdrücken zerstört werden.”

    – Max Heiber

    7. Januar 2017 um 15:07 Uhr


  • @mheiber: Es bedeutet, dass sie gleich sein können. Und mehrere Implementierungen implementieren new, indem sie malloc aufrufen (beachten Sie, dass der umgekehrte Weg ausdrücklich nicht erlaubt ist). Aber mehrere Implementierungen halten diese Speicherbereiche vollständig getrennt. Der Grund dafür, sie getrennt zu halten, besteht darin, dass dies eine Optimierung des C++-Speicherverwaltungscodes auf andere Weise als die C-Speicherverwaltung ermöglicht. Der Punkt ist: Sie könnten gleich sein, aber Sie können nicht davon ausgehen, dass sie es sind.

    – Martin York

    9. Januar 2017 um 17:43 Uhr

1647206408 959 Was ist der Unterschied zwischen newdelete und mallocfree
Fangen

Der relevanteste Unterschied ist, dass die new Der Operator weist Speicher zu und ruft dann den Konstruktor und auf delete ruft den Destruktor auf und gibt dann den Speicher frei.

  • Genau genommen allokiert der new-Operator nur den Speicher. Es ist der neue Ausdruck, der den new-Operator aufruft und dann den Konstruktor im zugewiesenen Speicher ausführt.

    – Don Wakefield

    27. Oktober 2008 um 23:36 Uhr

  • Ein weiterer Unterschied besteht darin, wo der Speicher zugewiesen wird. Ich habe kürzlich irgendwo gesehen, dass malloc/free auf dem Heap operiert, während new/delete in einem anderen Bereich des Speichers operiert, dessen Name mir jetzt entgeht. (Es genügt jedoch zu sagen, dass der andere Bereich wahrscheinlich als ein weiterer Haufen betrachtet werden kann.)

    – RobH

    30. April 2009 um 19:29 Uhr

  • @mgb: Ja, Sie haben Recht, dass Objekte entweder dem “Anwendungsheap” oder dem Stapel zugewiesen werden. Aber @RobH bezieht sich auf das, was der Standard als verschiedene Teile des “Application Heap” bezeichnet. Es gibt den “Heap”, von dem malloc Speicher zuweist, und “Free Store”, von dem new Speicher zuweist. Obwohl drin etwas Implementierungen überschneiden sich diese Bereiche (dies ist ein Implementierungsdetail).

    – Martin York

    28. November 2009 um 2:01 Uhr

  • Ihre Aussage ist zu 100% richtig, beantwortet aber einfach nicht die gestellte Frage, siehe die Antwort unten, es gibt einen Grund, warum sie mehr Stimmen hat als Ihre.

    – Murali

    20. Januar 2010 um 16:58 Uhr

  • Alles, was ich sagen wollte, war, dass malloc/free zumindest teilweise erwähnt werden sollte, damit es sich als Vergleich qualifiziert, der Ihrer Antwort fehlte. Trotzdem ist es eine relevante und genaue Aussage, also die Upvotes, ich hoffe, Sie verstehen meinen Punkt. Wie auch immer, wenn SO mir nur erlauben würde, meine Ablehnung zurückzunehmen, würde ich das von ganzem Herzen tun.

    – Murali

    22. Januar 2010 um 3:06 Uhr


new ruft den Ctor des Objekts auf, delete Rufen Sie den Arzt an.

malloc & free Weisen Sie einfach rohen Speicher zu und geben Sie ihn frei.

  • Was meinst du mit Rohspeicher?

    – Destruktor

    5. Januar 2015 um 15:50 Uhr

  • An der rohen Erinnerung wurde nichts getan. Es wurde noch kein Objekt darin konstruiert, es wurde nichts hineinkopiert und in den meisten Fällen wurden die vorherigen Inhalte nicht überschrieben.

    – James Curran

    5. Januar 2015 um 23:04 Uhr

1647206409 833 Was ist der Unterschied zwischen newdelete und mallocfree
Treb

new/delete ist C++, malloc/free kommt vom guten alten C.

In C++, new ruft einen Objektkonstruktor und auf delete ruft den Destruktor auf.

malloc und freedie aus den dunklen Zeiten vor OO stammen, weisen nur den Speicher zu und geben ihn frei, ohne einen Code des Objekts auszuführen.

Was ist der Unterschied zwischen newdelete und mallocfree
Verschlüsselt

In C++ new/delete Rufen Sie den Konstruktor/Destruktor entsprechend auf.

malloc/free Weisen Sie einfach Speicher aus dem Heap zu. new/delete auch Speicher zuweisen.

Was ist der Unterschied zwischen newdelete und mallocfree
Marius Bancila

Die einzigen Ähnlichkeiten sind das malloc/new Beide geben einen Zeiger zurück, der einen Teil des Speichers auf dem Heap adressiert, und beide garantieren, dass ein solcher Speicherblock, sobald er zurückgegeben wurde, nicht erneut zurückgegeben wird, es sei denn, Sie geben ihn zuerst frei/löschen ihn. Das heißt, beide “ordnen” Speicher zu.

Aber, new/delete zusätzlich beliebige andere Arbeiten über Konstruktoren, Destruktoren und Operatorüberladung ausführen. malloc/free immer nur Speicher zuweisen und freigeben.

In der Tat, new ist ausreichend anpassbar, dass es nicht unbedingt Speicher aus dem Heap zurückgibt oder überhaupt Speicher zuweist. Allerdings die Vorgabe new tut.

1647206410 991 Was ist der Unterschied zwischen newdelete und mallocfree
Donald Duck

Der Hauptunterschied zwischen new und malloc besteht darin, dass new den Konstruktor des Objekts aufruft und der entsprechende Aufruf von delete den Destruktor des Objekts aufruft.

Es gibt weitere Unterschiede:

  • new ist typsicher, malloc gibt Objekte des Typs zurück void*

  • new löst bei Fehler eine Ausnahme aus, malloc kehrt zurück NULL und setzt errno

  • new ist ein Operator und kann überladen werden, malloc ist eine Funktion und kann nicht überladen werden

  • new[]das Arrays allokiert, ist intuitiver und typsicherer als malloc

  • malloc-abgeleitete Zuweisungen können über in der Größe verändert werden realloc, new-abgeleitete Zuweisungen können nicht in der Größe geändert werden

  • malloc kann ein N-Byte-Stück Speicher zuweisen, new muss aufgefordert werden, ein Array von beispielsweise char Typen

Betrachtet man die Unterschiede, lässt sich zusammenfassend sagen, dass malloc C-esque ist, new C++-esque ist. Verwenden Sie diejenige, die sich für Ihre Codebasis richtig anfühlt.

Obwohl es legal ist, dass new und malloc mit unterschiedlichen Speicherzuweisungsalgorithmen implementiert werden, wird new auf den meisten Systemen intern mit malloc implementiert, was zu keinem Unterschied auf Systemebene führt.

999040cookie-checkWas ist der Unterschied zwischen new/delete und malloc/free?

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

Privacy policy