Was ist der Unterschied zwischen „neuen“ und „malloc“ und „calloc“ in C ++? [Duplikat]
-
03-07-2019 - |
Frage
Was ist der Unterschied zwischen „neuen“ und „malloc“ und „calloc“ und andere in der Familie?
(Wenn) Muss ich etwas brauchen anders als "neu"?
Ist einer von ihnen umgesetzt andere Verwendung?
Lösung
new
und delete
sind C ++ spezifische Funktionen. Sie existieren nicht in C. malloc
ist die alte Schule C Art und Weise, Dinge zu tun. Die meiste Zeit, Sie werden es nicht in C ++ verwenden müssen.
-
malloc
ordnet nicht initialisierten Speicher. Der zugewiesene Speicher mitfree
freigegeben werden. -
calloc
wiemalloc
ist aber initialisiert den zugewiesenen Speicher mit einer konstanten (0). Es muss befreit werden mitfree
. -
new
initialisiert den zugewiesenen Speicher durch den Konstruktor aufrufen (wenn es ein Objekt ist). Speicher mitnew
zugewiesen sollten mitdelete
freigegeben werden (was wiederum ruft der destructor). Es braucht nicht manuell die Größe, die Sie angeben müssen, und es in den entsprechenden Typ gegossen. Daher ist es modernere und weniger fehleranfällig.
Andere Tipps
neu / löschen + new [] / delete []:
- neu / löschen ist die C ++ Art und Weise Speicher und ausplanen Speicher aus dem Heap zugewiesen werden.
- new [] und delete [] ist die C ++ Art und Weise Arrays von zusammenhängenden Speicher zuzuweisen.
- Sollte verwendet werden, da es mehr Typen sicher als malloc ist
- Sollte verwendet werden, da es den Konstruktor / Destruktor ruft
- Kann nicht in einer realloc Weise verwendet werden, aber neue Platzierung wieder verwenden die gleichen Puffer von Daten verwenden können,
- Die Daten können nicht mit neuen zugeordnet werden und mit freiem befreit, noch löschen []
malloc / free + Familie:
- malloc / free / Familie ist die C Art und Weise und die freie Speicher aus dem Heap zu reservieren.
- calloc ist die gleiche wie malloc aber initialisiert auch den Speicher
- Sollte verwendet werden, wenn Sie den Speicher müssen neu zuzuteilen
- Die Daten können nicht mit malloc und befreit mit Lösch zurechenbar noch löschen []
Siehe auch mein Antwort hier im Zusammenhang
- neu zuordnet und Anrufe an Ctor (die Reihenfolge nicht näher bezeichnet ist), die dtor löschen und befreit die durch einen Anruf zugewiesenen Speicher zu neuen
- malloc nur Speicher zuordnet, frei löscht von malloc Speicher
- neu implementiert werden können malloc (nicht erforderlich, wenn der Standard)
- calloc macht das Gleiche wie malloc und zeroizes auch die neu zugewiesenen Speicher
Wie andere Beiträge haben darauf hingewiesen:. Malloc / free Teil von C ++ kompatibel zu sein mit C
Siehe auch: Stroustrup: neue vs malloc
Mit neuen Mitteln, die Konstrukteure auf den neu zugewiesenen Speicher aufgerufen werden. Wenn das Ding zugeordnet sind Konstrukteure nicht hat, ist neu funktional identisch mit malloc. und sollte in der Regel in pereference darauf verwendet werden.
new kann oder auch nicht im Hinblick auf die malloc implementiert werden können - der C ++ Standard nicht entweder Ansatz erfordert
.Sie brauchen nichts anderes als neu. Es ist ein vollständiger Ersatz für malloc in C ++.
Wie für die Differenz: Malloc reserviert nur Speicher. Neu zugewiesenen Speicher und ruft die Konstrukteure. Ebenso frei veröffentlicht nur die Erinnerung. Löschen gibt den Speicher und ruft den destructor.
Ein Wort der Warnung: Verwenden Sie die beiden Idiome nicht mischen. Die Ergebnisse sind nicht definiert.
Der Hauptunterschied zwischen neuen und malloc ich mich erinnern kann, ist, dass Sie nicht Speicher zugewiesen durch neue mit realloc umverteilen können. Also, wenn Sie die Größe des Speicherblocks erhöhen / verringern wollte, musste man einen neuen Block verteilen und kopieren Sie alles über.
calloc können Sie den Speicherblock initialisieren Sie malloc zuweisen, während nicht.
Wenn Sie neue ein Objekt, Raum für das Objekt wird nicht nur zugeordnet, sondern die Konstrukteurs-Objekt aufgerufen wird. Aber das ist die C ++ Art und Weise ihres getan, malloc ist die alte Version Art und Weise in C Speicher zugewiesen wird. calloc ist die gleiche wie malloc , mit Ausnahme es löscht Speicher alle Bits Null.