Quelle est la difference entre new
/ delete
et malloc
/ free
?
Connexes (en double?): Dans quels cas dois-je utiliser malloc vs new?
c++
memory-management
MrDatabase
la source
la source
Réponses:
nouveau / supprimer
malloc / gratuit
Tableau de comparaison des fonctionnalités:
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 zones soient identiques est un détail de mise en œuvre, ce qui est une autre raison pour laquelle malloc et new ne peuvent pas être mélangés.
la source
If ptr is NULL, no operation is performed.
new
opérateur alloue de la mémoire à partir du magasin libre (également connu sous le nom de mémoire dynamique et tas .) Le C ++ 14 standard, section 3.7.4 sur Dynamic Storage dit : " Les objets peuvent être créés lors de l' exécution du programme de manière dynamique (1,9), en utilisant de nouveaux-expressions (5.3.4), et détruits à l' aide de suppression-expressions."La différence la plus pertinente est que l'
new
opérateur alloue de la mémoire puis appelle le constructeur, etdelete
appelle le destructeur puis libère la mémoire.la source
new
appelle le ctor de l'objet,delete
appelez le dtor.malloc
&free
juste allouer et libérer la mémoire brute.la source
new
/delete
est C ++,malloc
/free
vient du bon vieux C.En C ++,
new
appelle un constructeur d'objets etdelete
appelle le destructeur.malloc
etfree
, venant des âges sombres avant OO, alloue et libère uniquement la mémoire, sans exécuter aucun code de l'objet.la source
En C ++
new
/delete
appelez le constructeur / destructeur en conséquence.malloc
/free
alloue simplement la mémoire du tas.new
/delete
allouer de la mémoire également.la source
Les seules similitudes sont que
malloc
/ lesnew
deux retournent un pointeur qui adresse de la mémoire sur le tas, et ils garantissent tous les deux qu'une fois qu'un tel bloc de mémoire a été retourné, il ne sera pas renvoyé à moins que vous ne le libériez / supprimiez d'abord. Autrement dit, ils «allouent» tous les deux de la mémoire.Cependant,
new
/delete
effectuer d'autres travaux arbitraires en plus, via les constructeurs, les destructeurs et la surcharge des opérateurs.malloc
/free
uniquement allouer et libérer de la mémoire.En fait,
new
est suffisamment personnalisable pour ne pas nécessairement renvoyer de mémoire à partir du tas, ni même allouer de mémoire. Cependant, la valeur par défaut lenew
fait.la source
La principale différence entre new et malloc est que new invoque le constructeur de l'objet et l'appel correspondant à delete invoque le destructeur de l'objet.
Il existe d'autres différences:
new
est de type sécurisé,malloc
renvoie des objets de typevoid*
new
lève une exception en cas d'erreur,malloc
retourneNULL
et définit errnonew
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 sûr pour les types quemalloc
malloc
-les allocations dérivées peuvent être redimensionnées viarealloc
,new
-les allocations dérivées ne peuvent pas être redimensionnéesmalloc
peut allouer un bloc de mémoire de N octets,new
doit être invité à allouer un tableau de, disons,char
typesEn regardant les différences, un résumé est malloc est C-esque, nouveau est C ++ - esque. Utilisez celui qui convient à votre base de code.
Bien qu'il soit légal d'implémenter new et malloc à l'aide d'algorithmes d'allocation de mémoire différents, sur la plupart des systèmes, new est implémenté en interne à l'aide de malloc, ne produisant aucune différence au niveau du système.
la source
Il y a quelques choses qui
new
ne lemalloc
font pas:new
construit l'objet en appelant le constructeur de cet objetnew
ne nécessite pas de transtypage 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é maismalloc
ne peut pas l'être.En un mot, si vous utilisez C ++, essayez d'en utiliser
new
autant que possible.la source
aussi,
le nouveau global et la suppression peuvent être remplacés, malloc / free ne peut pas.
de plus en plus de nouveaux et supprimer peuvent être remplacés par type.
la source
new
etdelete
sont des primitives C ++ qui déclarent une nouvelle instance d'une classe ou la suppriment (invoquant ainsi le destructeur de la classe pour l'instance).malloc
etfree
sont des fonctions C qui allouent et libèrent des blocs de mémoire (en taille).Les deux utilisent le tas pour effectuer l'allocation.
malloc
etfree
sont néanmoins plus "bas niveau" car ils réservent juste un morceau 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).la source
new et delete sont des opérateurs en c ++; qui peut être surchargé aussi. malloc et free fonctionnent en c;
malloc retourne null ptr en cas d'échec tandis que new lève une exception.
l'adresse retournée par malloc doit être de nouveau castée par type car elle retourne le (void *) malloc (taille) New retourne le pointeur tapé.
la source
la source
malloc()
, nous devons inclure<stdlib.h>
ou<alloc.h>
dans le programme qui n'est pas requis pournew
.new
etdelete
peut être surchargé maismalloc
ne peut pas.new
, nous pouvons passer l'adresse où nous voulons allouer de la mémoire mais ce n'est pas possible en cas demalloc
.la source
alloc.h
n'est pas un en-tête standard.<new>
est requis pour utiliser le placement nouveau.Ce code pour l'utilisation du mot-clé de suppression ou de la fonction gratuite. Mais lorsque vous créez un objet pointeur à l'aide de 'malloc' ou 'new' et que vous désallouez la mémoire d'objet à l'aide de la suppression, même ce pointeur d'objet peut être appelé fonction dans la classe. Après cela, utilisez free au lieu de supprimer, cela fonctionne également après l'instruction free, mais lorsque vous utilisez les deux, seul l'objet pointeur ne peut pas appeler pour fonctionner en classe. Le code est le suivant:
la source
1.new syntex est plus simple que malloc ()
2.new/delete est un opérateur où malloc () / free () est une fonction.
3.new/delete s'exécute plus rapidement que malloc () / free () car le nouveau code d'assemblage est directement collé par le compilateur.
4.nous pouvons changer le sens nouveau / supprimer dans le programme à l'aide de la surcharge de l'opérateur.
la source