Was ist der Unterschied zwischen new/ deleteund malloc/ free?
Verwandte (Duplikate?): In welchen Fällen verwende ich malloc vs new?
Was ist der Unterschied zwischen new/ deleteund 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.
newOperator 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 newOperator Speicher zuweist, dann den Konstruktor deleteaufruft und den Destruktor aufruft und dann den Speicher freigibt.
newruft den ctor des Objekts auf, deleteruft den dtor auf.
malloc& freeeinfach Rohspeicher zuweisen und freigeben.
new/ deleteist C ++, malloc/ freestammt aus dem guten alten C.
Ruft in C ++ neweinen Objektkonstruktor und deleteden Destruktor auf.
mallocund 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/ deleteden Konstruktor / Destruktor entsprechend auf.
malloc/ freeEinfach - Speicher aus dem Heap zuzuteilen. new/ deleteordne auch Speicher zu.
Die einzigen Ähnlichkeiten bestehen darin, dass malloc/ newbeide 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/ deleteführen beliebige andere Arbeiten zusätzlich über den Bau, Destruktoren und Betreiber Überlastung. malloc/ freenur immer Speicher zuweisen und freigeben.
Tatsächlich newist es ausreichend anpassbar, dass es nicht unbedingt Speicher vom Heap zurückgibt oder überhaupt Speicher zuweist. Die Standardeinstellung newgilt 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:
newist typsicher und mallocgibt Objekte vom Typ zurückvoid*
newlöst bei einem Fehler eine Ausnahme aus, gibt malloczurück NULLund setzt errno
newist ein Operator und kann überladen werden, mallocist 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
mallockann einen N-Byte-Speicherblock newzuweisen , muss aufgefordert werden, ein Array von beispielsweise charTypen 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 newdas mallocnicht 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 newkann überlastet werden, mallockann aber nicht sein.
Kurz gesagt, wenn Sie C ++ verwenden, versuchen Sie, newso viel wie möglich zu verwenden.
newund deletesind C ++ - Grundelemente, die eine neue Instanz einer Klasse deklarieren oder löschen (wodurch der Destruktor der Klasse für die Instanz aufgerufen wird).
mallocund freesind C- Funktionen und sie ordnen Speicherblöcke (in der Größe) zu und geben sie frei.
Beide verwenden den Heap, um die Zuordnung vorzunehmen. mallocund freesind 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.newund deletekann überlastet werden, mallockann aber nicht.newkönnen wir die Adresse übergeben, an die wir Speicher zuweisen möchten, dies ist jedoch im Fall von nicht möglich malloc.alloc.hist 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.