it-swarm.com.de

Was ist der Unterschied zwischen "new" und "malloc" und "calloc" in C ++?

Was ist der Unterschied zwischen "new" und "malloc" und "calloc" und anderen Familienmitgliedern?

(Wann) brauche ich etwas anderes als "neu"?

Wird einer von ihnen mit einem anderen implementiert?

51
Łukasz Lew

new und delete sind C++ - spezifische Funktionen. Sie existierten nicht in C. malloc ist die alte Art, Dinge zu tun. Meistens müssen Sie es nicht in C++ verwenden.

  • malloc reserviert nicht initialisierten Speicher. Der zugewiesene Speicher muss mit free freigegeben werden.
  • calloc ist wie malloc, initialisiert jedoch den zugewiesenen Speicher mit einer Konstanten (0). Es muss mit free freigegeben werden.
  • new initialisiert den zugewiesenen Speicher, indem der Konstruktor aufgerufen wird (falls es sich um ein Objekt handelt). Der mit new zugewiesene Speicher sollte mit delete freigegeben werden (was wiederum den Destruktor aufruft). Sie müssen die benötigte Größe nicht manuell angeben und in den entsprechenden Typ umwandeln. Somit ist es moderner und weniger fehleranfällig.
71
Mehrdad Afshari

neu/löschen + neu []/löschen []:

  • new/delete ist die C++ - Methode zum Zuweisen von Speicher und zum Freigeben von Speicher aus dem Heap.
  • mit new [] und delete [] können Arrays mit zusammenhängendem Speicher in C++ zugewiesen werden.
  • Sollte verwendet werden, da es typsicherer als Malloc ist
  • Sollte verwendet werden, weil es den Konstruktor/Destruktor aufruft
  • Kann nicht neu zugeordnet werden, kann jedoch mithilfe der neuen Platzierung denselben Datenpuffer wiederverwenden
  • Daten können nicht mit neu zugewiesen und mit kostenlos freigegeben oder gelöscht werden []

malloc/free + family:

  • malloc/free/family ist die C-Methode zum Zuweisen und Freigeben von Speicher aus dem Heap.
  • calloc ist dasselbe wie malloc, initialisiert aber auch den Speicher
  • Sollte verwendet werden, wenn Sie möglicherweise den Speicher neu zuweisen müssen
  • Daten können nicht mit malloc zugewiesen und mit delete oder delete [] freigegeben werden

Siehe auch meine verwandte Antwort hier

20
Brian R. Bondy
  • new weist ctor zu und ruft ctor auf (die Reihenfolge ist nicht festgelegt), löscht dtor und gibt den durch einen Aufruf zugewiesenen Speicher für new frei
  • malloc reserviert nur einen Teil des Speichers, free löscht den von malloc reservierten Speicher
  • new kann mit malloc implementiert werden (wird aber vom Standard nicht benötigt)
  • calloc macht dasselbe wie malloc und setzt auch den neu zugewiesenen Speicher auf Null

Wie andere Posts bereits betont haben: malloc/free ist Teil von C++, um mit C kompatibel zu sein.

Siehe auch: Stroustrup: new vs malloc

8
dirkgently

Mit new werden Konstruktoren für den neu zugewiesenen Speicher aufgerufen. Wenn das zuzuweisende Objekt keine Konstruktoren hat, ist new funktional identisch mit malloc. und sollte normalerweise als Referenz verwendet werden.

neu kann oder kann nicht in Bezug auf Malloc implementiert werden - der C++ - Standard erfordert keinen der beiden Ansätze.

5
anon

Sie brauchen nichts anderes als neu. Es ist ein vollständiger Ersatz für Malloc in C++.

Was den Unterschied betrifft: Malloc weist nur Speicher zu. Neu zugewiesener Speicher und Aufruf der Konstruktoren. Ebenso gibt free nur den Speicher frei. Löschen gibt den Speicher frei und ruft den Destruktor auf.

Ein Wort der Warnung: Vermischen Sie nicht die beiden Redewendungen. Die Ergebnisse sind undefiniert.

5
Steve Rowe

der Hauptunterschied zwischen new und malloc, an den ich mich erinnern kann, besteht darin, dass Sie den durch new zugewiesenen Speicher nicht mit realloc neu zuweisen können. Wenn Sie also den Speicherblock vergrößern/verkleinern möchten, müssen Sie einen neuen Block zuweisen und alles kopieren.

Mit Calloc können Sie den von Ihnen zugewiesenen Speicherblock initialisieren, ohne dass dies bei malloc der Fall ist.

1
z -

Wenn Sie ne ein Objekt, wird nicht nur Platz für das Objekt zugewiesen, sondern der Konstruktor des Objekts wird aufgerufen. Aber dies ist der C++ Weg, den es geht, malloc ist der alte Versionsweg in [~ # ~] c [~ # ~] Speicherzuweisung. calloc ist dasselbe wie malloc, außer dass der Speicher auf alle Bits Null gelöscht wird.

1
TStamper