Qual è la differenza tra new
/ delete
e malloc
/ free
?
Correlato (duplicato?): In quali casi utilizzo malloc vs new?
Qual è la differenza tra new
/ delete
e malloc
/ free
?
Correlato (duplicato?): In quali casi utilizzo malloc vs new?
Risposte:
Tabella comparativa delle caratteristiche:
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
Tecnicamente la memoria allocata da new proviene dal 'Free Store' mentre la memoria allocata da malloc proviene da 'Heap'. Se queste due aree sono uguali è un dettaglio di implementazione, che è un'altra ragione per cui malloc e new non possono essere mescolati.
If ptr is NULL, no operation is performed.
new
operatore alloca memoria dal negozio gratuito (noto anche come memoria dinamica e heap ). Lo standard C ++ 14, sezione 3.7.4 su Dynamic Storage dice che "Gli oggetti possono essere creati dinamicamente durante l'esecuzione del programma (1.9), usando new-expressions (5.3.4), e distrutti usando delete-expressions."
La differenza più rilevante è che l' new
operatore alloca la memoria, quindi chiama il costruttore e delete
chiama il distruttore, quindi disloca la memoria.
new
chiama il ctor dell'oggetto, delete
chiama il dtor.
malloc
e free
basta allocare e rilasciare la memoria grezza.
new
/ delete
è C ++, malloc
/ free
viene dal buon vecchio C.
In C ++, new
chiama un costruttore di oggetti e delete
chiama il distruttore.
malloc
e free
, proveniente dai secoli bui prima di OO, alloca e libera solo la memoria, senza eseguire alcun codice dell'oggetto.
Le uniche somiglianze sono che malloc
/ new
entrambi restituiscono un puntatore che indirizza un po 'di memoria sull'heap, ed entrambi garantiscono che una volta che tale blocco di memoria è stato restituito, non verrà restituito di nuovo a meno che non lo si liberi / lo si elimini prima. Cioè, entrambi "allocano" la memoria.
Tuttavia, new
/ delete
eseguire altri lavori arbitrari in aggiunta, tramite costruttori, distruttori e sovraccarico dell'operatore. malloc
/ free
solo allocare e liberare memoria.
In effetti, new
è sufficientemente personalizzabile da non necessariamente restituire memoria dall'heap, né allocare memoria affatto. Tuttavia, l'impostazione predefinita lo new
fa.
La differenza principale tra new e malloc è che new invoca il costruttore dell'oggetto e la corrispondente chiamata per eliminare invoca il distruttore dell'oggetto.
Ci sono altre differenze:
new
è sicuro, malloc
restituisce oggetti di tipovoid*
new
genera un'eccezione in caso di errore, malloc
restituisce NULL
e imposta errno
new
è un operatore e può essere sovraccaricato, malloc
è una funzione e non può essere sovraccaricato
new[]
, che alloca le matrici, è più intuitivo e sicuro rispetto al tipo di malloc
malloc
le allocazioni derivate possono essere ridimensionate tramite realloc
, le new
allocazioni derivate non possono essere ridimensionate
malloc
può allocare un pezzo di memoria N-byte, new
deve essere richiesto di allocare un array di, diciamo, char
tipi
Guardando le differenze, un riassunto è che malloc è C-esque, nuovo è C ++ - esque. Usa quello che sembra giusto per la tua base di codice.
Sebbene sia legale implementare new e malloc usando diversi algoritmi di allocazione della memoria, sulla maggior parte dei sistemi i nuovi sono implementati internamente usando malloc, senza produrre alcuna differenza a livello di sistema.
Ci sono alcune cose che new
non lo malloc
fanno:
new
costruisce l'oggetto chiamando il costruttore di quell'oggettonew
non richiede il typecasting della memoria allocata.Quindi, se usi malloc
, allora devi fare esplicitamente le cose sopra, il che non è sempre pratico. Inoltre, new
può essere sovraccarico ma malloc
non può esserlo.
In una parola, se usi C ++, prova a usare new
il più possibile.
new
e delete
sono primitivi C ++ che dichiarano una nuova istanza di una classe o la eliminano (invocando così il distruttore della classe per l'istanza).
malloc
e free
sono funzioni C che allocano e liberano blocchi di memoria (in dimensioni).
Entrambi utilizzano l'heap per effettuare l'allocazione. malloc
e free
sono comunque più "a basso livello" in quanto riservano solo un pezzo di spazio di memoria che sarà probabilmente associato a un puntatore. Non vengono create strutture attorno a quella memoria (a meno che non si consideri una matrice C come una struttura).
new ed delete sono operatori in c ++; che può anche essere sovraccarico. malloc e free sono funzioni in c;
malloc restituisce null ptr quando fallisce mentre new genera un'eccezione.
l'indirizzo restituito da malloc deve essere castato di nuovo poiché restituisce il malloc (void *) (size) Nuovo restituisce il puntatore digitato.
malloc()
, dobbiamo includere <stdlib.h>
o
<alloc.h>
nel programma per il quale non è richiesto new
.new
e delete
può essere sovraccarico ma malloc
non può.new
, possiamo passare l'indirizzo dove vogliamo allocare memoria, ma questo non è possibile in caso di malloc
.alloc.h
non è un'intestazione standard. <new>
è necessario per utilizzare il posizionamento nuovo.
Questo codice per l'uso della parola chiave delete o della funzione gratuita. Ma quando si crea un oggetto puntatore usando 'malloc' o 'nuovo' e si dealloca la memoria degli oggetti usando delete, anche quel puntatore oggetto può essere chiamato funzione nella classe. Dopodiché usa free invece di delete quindi funziona anche dopo l'istruzione free, ma quando usa entrambi allora solo l'oggetto puntatore non può chiamare per funzionare in classe .. il codice è il seguente:
#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;
}
produzione :
Hello Hi 0x2abfef37cc20
1.nuovo sintassi è più semplice di malloc ()
2.new/delete è un operatore in cui malloc () / free () è una funzione.
3.new/delete viene eseguito più velocemente di malloc () / free () perché il nuovo codice assemly è stato incollato direttamente dal compilatore.
4.possiamo modificare il significato di nuovo / cancellare nel programma con l'aiuto dell'overlading dell'operatore.