Quelle est la différence entre new
/delete
et malloc
/free
?
Related (duplicate?): Dans quels cas dois-je utiliser malloc vs new?
Tableau de comparaison des fonctionnalités:
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
Techniquement, la mémoire allouée par new provient du "Free Store", tandis que la mémoire allouée par malloc provient du "Heap". Que ces deux domaines soient identiques est une mise en œuvre détaillée, ce qui est une autre raison pour laquelle malloc et new ne peuvent pas être mélangés.
La différence la plus pertinente est que l'opérateur new
alloue de la mémoire puis appelle le constructeur, et que delete
appelle le destructeur, puis libère la mémoire.
new
appelle le ctor de l'objet, delete
appelle le dtor.
malloc
& free
juste allouer et libérer de la mémoire brute.
En C++ new
/delete
, appelez le constructeur/destructeur en conséquence.
malloc
/free
allouez simplement de la mémoire à partir du tas. new
/delete
allouer également de la mémoire.
new
/delete
est C++, malloc
/free
vient du bon vieux C.
En C++, new
appelle un constructeur d'objets et delete
appelle le destructeur.
malloc
et free
, issus des âges sombres précédant OO, n'allouent et ne libèrent que la mémoire, sans exécuter aucun code de l'objet.
Les seules similitudes sont que malloc
/new
retournent tous les deux un pointeur qui adresse de la mémoire sur le tas, et ils garantissent qu'une fois qu'un bloc de mémoire a été renvoyé, il ne sera pas renvoyé à moins que vous ne le libériez/supprimiez d'abord. C'est-à-dire qu'ils "allouent" de la mémoire.
Cependant, new
/delete
effectue en outre un travail arbitraire, via les constructeurs, les destructeurs et la surcharge d'opérateurs. malloc
/free
seulement allouer et libérer de la mémoire.
En fait, new
est suffisamment personnalisable pour ne pas nécessairement restituer de la mémoire du tas, ni même allouer de la mémoire. Cependant, la valeur par défaut new
le fait.
La principale différence entre new et malloc est que new appelle le constructeur de l'objet et que l'appel à supprimer correspondant invoque le destructeur de l'objet.
Il y a d'autres différences:
new
est conforme au type, malloc
renvoie des objets de type void*
new
lève une exception en cas d'erreur, malloc
renvoie NULL
et définit errno
new
est un opérateur et peut être surchargé, malloc
est une fonction et ne peut pas être surchargé
new[]
, qui alloue les tableaux, est plus intuitif et compatible avec le type que malloc
malloc
- les allocations dérivées peuvent être redimensionnées via realloc
, new
- les allocations dérivées ne peuvent pas être redimensionnées
malloc
peut allouer un bloc de mémoire de N octets. new
doit être invité à allouer un tableau de, par exemple, char
types
En regardant les différences, un résumé est malloc est C-esque, nouvelle C++ - esque. Utilisez celui qui convient à votre base de code.
Bien qu'il soit légal d'implémenter new et malloc en utilisant différents algorithmes d'allocation de mémoire, sur la plupart des systèmes, new est implémenté en interne en utilisant malloc, ce qui ne donne aucune différence au niveau du système.
new
fait ce que malloc
ne fait pas:
new
construit l'objet en appelant le constructeur de cet objetnew
ne nécessite pas de conversion de la mémoire allouée.Donc, si vous utilisez malloc
, vous devez faire les choses ci-dessus explicitement, ce qui n’est pas toujours pratique. De plus, new
peut être surchargé mais malloc
ne le peut pas.
Dans un Word, si vous utilisez C++, essayez d'utiliser new
autant que possible.
également,
le nouveau global et supprimer peuvent être remplacés, malloc/free ne peut pas.
en outre, plus de nouveaux et de supprimer peuvent être remplacés par type.
new
et delete
sont C++ primitives qui déclarent une nouvelle instance d'une classe ou la suppriment (invoquant ainsi le destructeur de la classe pour l'instance).
malloc
et free
sont des fonctions Cet elles allouent et libèrent des blocs de mémoire (en taille).
Les deux utilisent le tas pour effectuer l'allocation. malloc
et free
sont néanmoins plus "bas niveau" car ils ne réservent qu'un bloc d'espace mémoire qui sera probablement associé à un pointeur. Aucune structure n'est créée autour de cette mémoire (sauf si vous considérez un tableau C comme une structure).
new et delete sont des opérateurs en c ++; qui peuvent être surchargés aussi . malloc et free fonctionnent en c;
malloc renvoie la valeur null ptr en cas d'échec du lancement d'une nouvelle exception.
adresse renvoyée par malloc doit être typée à nouveau, car elle renvoie le (void *) malloc (taille) New retourne le pointeur saisi.
malloc()
, nous devons inclure <stdlib.h>
ou <alloc.h>
dans le programme qui n’est pas requis pour new
.new
et delete
peuvent être surchargés mais malloc
ne le peut pas.new
, nous pouvons passer l'adresse où nous voulons allouer de la mémoire, mais cela n'est pas possible dans le cas de malloc
.Ce code d'utilisation du mot-clé delete ou de la fonction free. Mais lorsque vous créez un objet pointeur en utilisant 'malloc' ou 'new' et libérez la mémoire d'objet en utilisant Delete, même ce pointeur d'objet peut être appelé fonction dans la classe. Après Qui utilise free au lieu de delete, cela fonctionne également après l'instruction free, Mais lorsque les deux sont utilisés, seul l'objet pointeur ne peut pas appeler fonction dans la classe .. Le code est le suivant:
#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;
}
sortie:
Hello Hi 0x2abfef37cc20