Was ist der Unterschied zwischen new
/ delete
und malloc
/ free
?
Verwandte (Duplikate?): In welchen Fällen verwende ich malloc vs new?
Was ist der Unterschied zwischen new
/ delete
und malloc
/ free
?
Verwandte (Duplikate?): In welchen Fällen verwende ich malloc vs new?
Antworten:
Tabellenvergleich der Funktionen:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
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.
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 Konstruktor delete
aufruft und den Destruktor aufruft und dann den Speicher freigibt.
new
ruft den ctor des Objekts auf, delete
ruft den dtor auf.
malloc
& free
einfach Rohspeicher zuweisen und freigeben.
new
/ delete
ist C ++, malloc
/ free
stammt aus dem guten alten C.
Ruft in C ++ new
einen Objektkonstruktor und delete
den Destruktor auf.
malloc
und free
, aus den dunklen Zeiten vor OO kommend, ordne nur den Speicher zu und gebe ihn frei, ohne irgendeinen Code des Objekts auszuführen.
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.
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 Standardeinstellung new
gilt jedoch.
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 und malloc
gibt Objekte vom Typ zurückvoid*
new
löst bei einem Fehler eine Ausnahme aus, gibt malloc
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 zuweist, ist intuitiver und typsicherer als malloc
malloc
-derivierte Zuordnungen können über geändert werden realloc
. new
-derivierte Zuordnungen können nicht in der Größe geändert werden
malloc
kann einen N-Byte-Speicherblock new
zuweisen , muss aufgefordert werden, ein Array von beispielsweise char
Typen zuzuweisen
Wenn 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.
Es gibt ein paar Dinge, die new
das malloc
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 hinaus new
kann überlastet werden, malloc
kann aber nicht sein.
Kurz gesagt, wenn Sie C ++ verwenden, versuchen Sie, new
so viel wie möglich zu verwenden.
new
und delete
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
und free
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
und free
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).
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.
malloc()
, müssen wir schließen <stdlib.h>
oder
<alloc.h>
im Programm , die nicht für erforderlich new
.new
und delete
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öglich malloc
.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:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
Ausgabe :
Hello Hi 0x2abfef37cc20
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.