webentwicklung-frage-antwort-db.com.de

Was ist der Unterschied zwischen Neu/Löschen und Malloc/Frei?

Was ist der Unterschied zwischen new/delete und malloc/free?

Verwandte (Duplikat?): In welchen Fällen verwende ich Malloc vs New?

269
MrDatabase

neu/Löschen

  • Speicher zuordnen/freigeben
    1. Speicherplatz aus 'Free Store' zugewiesen
    2. Gibt einen vollständig getippten Zeiger zurück.
    3. new (Standardversion) gibt niemals NULL zurück (wird bei einem Fehler ausgelöst)
    4. Werden mit Typ-ID aufgerufen (Compiler berechnet die Größe)
    5. Hat eine Version, um Arrays explizit zu behandeln.
    6. Neuzuordnen (um mehr Speicherplatz zu erhalten) wird nicht intuitiv behandelt (aufgrund des Kopierkonstruktors).
    7. Ob sie malloc/free aufrufen, ist durch die Implementierung definiert.
    8. Kann einen neuen Speicherzuweiser hinzufügen, um mit wenig Arbeitsspeicher umzugehen (set_new_handler)
    9. operator Neu/Löschen kann legal überschrieben werden
    10. Konstruktor/Destruktor zum Initialisieren/Zerstören des Objekts

malloc/kostenlos

  • Speicherplatz zuweisen/freigeben
    1. Speicher von 'Heap' zugewiesen
    2. Gibt eine Leere zurück *
    3. Gibt bei einem Fehler NULL zurück
    4. Muss die erforderliche Größe in Byte angeben.
    5. Das Zuweisen eines Arrays erfordert eine manuelle Berechnung des Speicherplatzes.
    6. Größere Speichermenge einfach neu zuordnen
    7. Sie werden NICHT Neu anrufen/löschen
    8. Keine Möglichkeit, Benutzercode in die Zuordnungssequenz zu spleißen, um Speicherplatz zu sparen.
    9. malloc/free kann NICHT gesetzlich überschrieben werden

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 stammt der durch neu zugewiesene Speicher aus dem "Free Store", während der von malloc zugewiesene Speicher aus dem "Heap" stammt. Wenn diese beiden Bereiche gleich sind, handelt es sich um Implementierungsdetails. Dies ist ein weiterer Grund dafür, dass Malloc und Neues nicht gemischt werden können.

444
Martin York

Der wichtigste Unterschied besteht darin, dass der Operator new Speicher zuordnet, dann den Konstruktor aufruft und delete den Destruktor aufruft und den Speicher freigibt.

79
Trap

new ruft den ctor des Objekts auf, delete ruft den dtor auf.

malloc & free ordnen Sie einfach den Rohspeicher zu und geben Sie ihn frei.

29
James Curran

Rufen Sie in C++ new/delete den Konstruktor/Destruktor entsprechend auf.

malloc/free weist einfach Speicher aus dem Heap zu. new/delete weist ebenfalls Speicher zu.

13
Encryptic

new/delete ist C++, malloc/free stammt aus dem guten alten C.

In C++ ruft new einen Objektkonstruktor und delete den Destruktor auf. 

malloc und free, die aus den dunklen Zeitaltern vor OO stammen, reservieren und geben nur den Speicher frei, ohne Code des Objekts auszuführen.

12
Treb

Die einzigen Gemeinsamkeiten bestehen darin, dass malloc/new beide einen Zeiger zurückgibt, der Speicher auf dem Heapspeicher anspricht, und beide garantieren, dass ein derartiger Speicherblock erst dann zurückgegeben wird, wenn er freigegeben und gelöscht wird. Das heißt, beide "belegen" den Speicher. 

new/delete führt jedoch über Konstruktoren, Destruktoren und das Überladen von Operatoren beliebige andere Arbeiten aus. malloc/free reserviert immer nur Speicherplatz.

Tatsächlich ist new so anpassbar, dass nicht unbedingt Speicherplatz aus dem Heap zurückgegeben oder überhaupt Speicherplatz zugewiesen wird. Die Standardvariable new ist jedoch möglich.

10
Steve Jessop

Der Hauptunterschied zwischen new und malloc besteht darin, dass new den Konstruktor des Objekts aufruft und der entsprechende zu löschende Aufruf den Destruktor des Objekts aufruft.

Es gibt andere Unterschiede:

  • new ist typsicher, malloc gibt Objekte vom Typ void* zurück

  • new löst bei einem Fehler eine Ausnahme aus, malloc gibt NULL zurück und setzt errno

  • new ist ein Operator und kann überladen werden, malloc ist eine Funktion und kann nicht überladen werden

  • new[], der Arrays zuweist, ist intuitiver und typsicherer als malloc

  • malloc- abgeleitete Zuordnungen können über realloc geändert werden, new- abgeleitete Zuordnungen können nicht geändert werden

  • malloc kann einen N-Byte-Speicherblock zuweisen, new muss aufgefordert werden, ein Array mit char-Typen zuzuordnen

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 new und malloc mit unterschiedlichen Speicherzuweisungsalgorithmen implementiert werden dürfen, ist new auf den meisten Systemen intern mit malloc implementiert, sodass keine Unterschiede auf Systemebene erzielt werden.

6
Walter

Es gibt einige Dinge, die new tut, die malloc nicht tut:

  1. new konstruiert das Objekt durch Aufruf des Konstruktors dieses Objekts
  2. new erfordert keine Typumwandlung des zugewiesenen Speichers.
  3. Es muss keine Speichermenge zugewiesen werden, sondern es müssen mehrere -Objekte erstellt werden.

Wenn Sie also malloc verwenden, müssen Sie die oben genannten Dinge explizit ausführen, was nicht immer praktisch ist. Außerdem kann new überladen sein, malloc jedoch nicht.

Wenn Sie in einem Word C++ verwenden, versuchen Sie, möglichst viel new zu verwenden.

5
herohuyongtao

ebenfalls,

das globale new und delete kann überschrieben werden, malloc/free nicht.

weitere neue und Löschungen können pro Typ überschrieben werden.

4
DanJ

new und delete sind C++ primitives , 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 weisen Speicherblöcke (in der Größe) zu und geben sie frei.

Beide verwenden den Heap, um die Zuordnung vorzunehmen. malloc und free sind jedoch eher "low level", da sie nur einen Teil des Speicherplatzes reservieren, der wahrscheinlich einem Zeiger zugeordnet wird. In diesem Speicher werden keine Strukturen erstellt (es sei denn, Sie betrachten ein C-Array als Struktur).

3
Jorge Córdoba

new und delete sind Operatoren in C++; die auch überladen werden können . malloc und free funktionieren in c;

malloc gibt null ptr zurück, wenn ein Fehler auftritt, während new eine Ausnahme auslöst.

adresse, die von malloc zurückgegeben werden muss, muss vom Typ erneut umgewandelt werden, da die (void *) malloc (size)

2
VishalTiwari
  • new ist ein Operator, während malloc () eine Funktion ist.
  • new gibt den genauen Datentyp zurück, während malloc () void * (Zeiger vom Typ void) zurückgibt.
  • malloc (), der Speicher wird nicht initialisiert und der Standardwert ist Müll, wohingegen der Speicher mit new mit dem Standardwert initialisiert wird, z.
  • delete und free () können beide für 'NULL'-Zeiger verwendet werden.
2
Anurag Singh
  • Um malloc() verwenden zu können, müssen wir include<stdlib.h> oder <alloc.h> im Programm verwenden, was für new nicht erforderlich ist.
  • new und delete können überladen sein, malloc jedoch nicht.
  • Mit der Platzierung new können wir die Adresse an die Stelle übergeben, an der Speicherplatz zugewiesen werden soll Speicherplatz zuweisen. Dies ist jedoch im Fall von malloc nicht möglich.
1
ron davis

Dieser Code für die Verwendung des Schlüsselworts delete oder der freien Funktion. Wenn Sie jedoch ein Pointer-Objekt mit 'malloc' oder 'new' erstellen und den Objektspeicher mit Delete freigeben, kann auch dieser Objektzeiger eine Aufruffunktion in der Klasse sein. Nach , Das free anstelle von delete verwendet, funktioniert es auch nach der free-Anweisung Wenn jedoch beide verwendet werden, kann ein Zeigerobjekt keine Funktion in der Klasse ...__ aufrufen. 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
0
chirag kadam