Qual è la differenza tra new/ deletee malloc/ free?
Correlato (duplicato?): In quali casi utilizzo malloc vs new?
Qual è la differenza tra new/ deletee 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.
newoperatore 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' newoperatore alloca la memoria, quindi chiama il costruttore e deletechiama il distruttore, quindi disloca la memoria.
newchiama il ctor dell'oggetto, deletechiama il dtor.
malloce freebasta allocare e rilasciare la memoria grezza.
new/ deleteè C ++, malloc/ freeviene dal buon vecchio C.
In C ++, newchiama un costruttore di oggetti e deletechiama il distruttore.
malloce 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/ newentrambi 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/ deleteeseguire altri lavori arbitrari in aggiunta, tramite costruttori, distruttori e sovraccarico dell'operatore. malloc/ freesolo 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 newfa.
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, mallocrestituisce oggetti di tipovoid*
newgenera un'eccezione in caso di errore, mallocrestituisce NULLe 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
mallocle allocazioni derivate possono essere ridimensionate tramite realloc, le newallocazioni derivate non possono essere ridimensionate
mallocpuò allocare un pezzo di memoria N-byte, newdeve essere richiesto di allocare un array di, diciamo, chartipi
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 newnon lo mallocfanno:
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, newpuò essere sovraccarico ma mallocnon può esserlo.
In una parola, se usi C ++, prova a usare newil più possibile.
newe deletesono primitivi C ++ che dichiarano una nuova istanza di una classe o la eliminano (invocando così il distruttore della classe per l'istanza).
malloce freesono funzioni C che allocano e liberano blocchi di memoria (in dimensioni).
Entrambi utilizzano l'heap per effettuare l'allocazione. malloce freesono 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.newe deletepuò essere sovraccarico ma mallocnon può.new, possiamo passare l'indirizzo dove vogliamo allocare memoria, ma questo non è possibile in caso di malloc.alloc.hnon è 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.