Was ist der Unterschied zwischen new
/ delete
und malloc
/ free
?
Verwandte (Duplikate?): In welchen Fällen verwende ich malloc vs new?
c++
memory-management
MrDatabase
quelle
quelle
Antworten:
neu / löschen
malloc / frei
Tabellenvergleich der Funktionen:
Technisch gesehen stammt der von new zugewiesene Speicher aus dem 'Free Store', während der von malloc zugewiesene Speicher aus dem 'Heap' stammt. Ob diese beiden Bereiche gleich sind, ist ein Implementierungsdetail. Dies ist ein weiterer Grund, warum malloc und new nicht gemischt werden können.
quelle
If ptr is NULL, no operation is performed.
new
Operator weist Speicher aus dem Free Store zu (auch als dynamischer Speicher bekannt) und Heap ) . Der C ++ 14 Standard Abschnitt 3.7.4 auf Dynamic Storage sagt "Objekte können dynamisch während der Programmausführung (1.9) erstellt werden, neue Ausdrücke (5.3.4), und vernichteten mit Lösch-Ausdrücke."Der relevanteste Unterschied besteht darin, dass der
new
Operator Speicher zuweist, dann den Konstruktordelete
aufruft und den Destruktor aufruft und dann den Speicher freigibt.quelle
new
ruft den ctor des Objekts auf,delete
ruft den dtor auf.malloc
&free
einfach Rohspeicher zuweisen und freigeben.quelle
new
/delete
ist C ++,malloc
/free
stammt aus dem guten alten C.Ruft in C ++
new
einen Objektkonstruktor unddelete
den Destruktor auf.malloc
undfree
, aus den dunklen Zeiten vor OO kommend, ordne nur den Speicher zu und gebe ihn frei, ohne irgendeinen Code des Objekts auszuführen.quelle
Rufen Sie in C ++
new
/delete
den Konstruktor / Destruktor entsprechend auf.malloc
/free
Einfach - Speicher aus dem Heap zuzuteilen.new
/delete
ordne auch Speicher zu.quelle
Die einzigen Ähnlichkeiten bestehen darin, dass
malloc
/new
beide einen Zeiger zurückgeben, der einen bestimmten Speicher auf dem Heap adressiert, und beide garantieren, dass ein solcher Speicherblock nach seiner Rückgabe erst wieder zurückgegeben wird, wenn Sie ihn zuerst freigeben / löschen. Das heißt, beide "reservieren" Speicher.Allerdings
new
/delete
führen beliebige andere Arbeiten zusätzlich über den Bau, Destruktoren und Betreiber Überlastung.malloc
/free
nur immer Speicher zuweisen und freigeben.Tatsächlich
new
ist es ausreichend anpassbar, dass es nicht unbedingt Speicher vom Heap zurückgibt oder überhaupt Speicher zuweist. Die Standardeinstellungnew
gilt jedoch.quelle
Der Hauptunterschied zwischen new und malloc besteht darin, dass new den Konstruktor des Objekts aufruft und der entsprechende Aufruf zum Löschen den Destruktor des Objekts aufruft.
Es gibt andere Unterschiede:
new
ist typsicher undmalloc
gibt Objekte vom Typ zurückvoid*
new
löst bei einem Fehler eine Ausnahme aus, gibtmalloc
zurückNULL
und setzt errnonew
ist ein Operator und kann überladen werden,malloc
ist eine Funktion und kann nicht überladen werdennew[]
, das Arrays zuweist, ist intuitiver und typsicherer alsmalloc
malloc
-derivierte Zuordnungen können über geändert werdenrealloc
.new
-derivierte Zuordnungen können nicht in der Größe geändert werdenmalloc
kann einen N-Byte-Speicherblocknew
zuweisen , muss aufgefordert werden, ein Array von beispielsweisechar
Typen zuzuweisenWenn man die Unterschiede betrachtet, ist eine Zusammenfassung: malloc ist C-esque, neu ist C ++ - esque. 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 keinen Unterschied auf Systemebene ergibt.
quelle
Es gibt ein paar Dinge, die
new
dasmalloc
nicht tun:new
Konstruiert das Objekt durch Aufrufen des Konstruktors dieses Objektsnew
erfordert keine Typumwandlung des zugewiesenen Speichers.Wenn Sie also verwenden
malloc
, müssen Sie die oben genannten Dinge explizit ausführen, was nicht immer praktisch ist. Darüber hinausnew
kann überlastet werden,malloc
kann aber nicht sein.Kurz gesagt, wenn Sie C ++ verwenden, versuchen Sie,
new
so viel wie möglich zu verwenden.quelle
ebenfalls,
Das globale Neu und Löschen kann überschrieben werden, malloc / free nicht.
Weitere Neuheiten und Löschvorgänge können pro Typ überschrieben werden.
quelle
new
unddelete
sind C ++ - Grundelemente, die eine neue Instanz einer Klasse deklarieren oder löschen (wodurch der Destruktor der Klasse für die Instanz aufgerufen wird).malloc
undfree
sind C- Funktionen und sie ordnen Speicherblöcke (in der Größe) zu und geben sie frei.Beide verwenden den Heap, um die Zuordnung vorzunehmen.
malloc
undfree
sind dennoch "niedriger", da sie nur einen Teil des Speicherplatzes reservieren, der wahrscheinlich einem Zeiger zugeordnet wird. Um diesen Speicher herum werden keine Strukturen erstellt (es sei denn, Sie betrachten ein C-Array als Struktur).quelle
new und delete sind Operatoren in c ++; was auch überlastet werden kann. malloc und free sind Funktion in c;
malloc gibt null ptr zurück, wenn ein Fehler auftritt, während new eine Ausnahme auslöst.
Die von malloc zurückgegebene Adresse muss vom Typ erneut umgewandelt werden, da sie den (void *) malloc (size) New zurückgibt. Geben Sie den eingegebenen Zeiger zurück.
quelle
quelle
malloc()
, müssen wir schließen<stdlib.h>
oder<alloc.h>
im Programm , die nicht für erforderlichnew
.new
unddelete
kann überlastet werden,malloc
kann aber nicht.new
können wir die Adresse übergeben, an die wir Speicher zuweisen möchten, dies ist jedoch im Fall von nicht möglichmalloc
.quelle
alloc.h
ist kein Standardheader.<new>
ist erforderlich, um Platzierung neu zu verwenden.Dieser Code zur Verwendung des Schlüsselworts delete oder der freien Funktion. Wenn Sie jedoch ein Zeigerobjekt mit 'malloc' oder 'new' erstellen und den Objektspeicher mit delete freigeben, kann auch dieser Objektzeiger eine Aufruffunktion in der Klasse sein. Danach benutze free statt delete, dann funktioniert es auch nach der free-Anweisung, aber wenn beide verwendet werden, kann nur das Zeigerobjekt nicht aufrufen, um in der Klasse zu funktionieren. Der Code lautet wie folgt:
quelle
1.new syntex ist einfacher als malloc ()
2.new/delete ist ein Operator, bei dem malloc () / free () eine Funktion ist.
3.new/delete wird schneller ausgeführt als malloc () / free (), da neuer Assemly-Code direkt vom Compiler eingefügt wird.
4. Wir können die Bedeutung von Neu / Löschen im Programm mit Hilfe der Operatorüberladung ändern.
quelle