Quelle est la différence entre new/delete et le malloc/free?
Quelle est la différence entre new
/delete
et malloc
/free
?
Connexes (double?): Dans quels cas dois-je utiliser malloc vs nouvelle?
- Voir aussi ma réponse détaillée here.
Vous devez vous connecter pour publier un commentaire.
de new/delete
malloc/free
Tableau de comparaison des caractéristiques:
Techniquement mémoire allouée par la nouvelle vient de la 'Boutique', tandis que la mémoire allouée par malloc vient de le 'Tas'. Si ces deux domaines sont les mêmes est un détails de mise en œuvre, ce qui est une autre raison qui malloc et les nouveaux ne peuvent pas être mélangés.
If ptr is NULL, no operation is performed.
new
opérateur alloue de la mémoire à partir de la free store (ou dynamique de la mémoire et segment). Le C++ 14 Standard, la section 3.7.4 sur Dynamique de Stockage dit "les Objets peuvent être créés dynamiquement pendant l'exécution du programme (1.9), utilisant les nouvelles-expressions (5.3.4), et détruit à l'aide de la suppression-des expressions."n4567
20.7.13 C-Bibliothèque de l'alinéa 5 (à propos de malloc):It also allows malloc() to be implemented with a separate allocation arena,
undeclare_unreachable
, qui est ce que le paragraphe est d'environ.new
. (Et il est également utilisé en C++ pour se référer à la structure de données, qui ne peut qu'ajouter à la confusion.)Les plus pertinents différence est que le
new
opérateur alloue de la mémoire, puis appelle le constructeur, etdelete
appelle le destructeur puis libère la mémoire.operator new()
". Partout où la "nouvelle l'opérateur" s'affiche, c'est un nouvelle-expression et de n'appeler le constructeur, il n'y a pas de différence significative entre les deux termes que vous avez utilisés dans votre commentaire.new
appelle la ctor de l'objet,delete
appeler le dtor.malloc
&free
juste d'allouer et de libérer de la mémoire brute.En C++
new
/delete
appel au Constructeur/Destructeur en conséquence.malloc
/free
il suffit d'allouer de la mémoire dans le tas.new
/delete
allouer de la mémoire en tant que bien.new
/delete
est le C++,malloc
/free
vient de la bonne vieille C.En C++,
new
appelle des objets constructeur etdelete
appelle le destructeur.malloc
etfree
, en provenance de l'âge des ténèbres avant OO, seulement allouer et libérer de la mémoire, sans exécuter le code de l'objet.Les seules similitudes sont que
malloc
/new
les deux retournent un pointeur d'adresses de la mémoire sur le tas, et ils garantir que, une fois un tel bloc de mémoire a été renvoyé, il ne sera pas retourné à nouveau, sauf si vous gratuit/effacer. Qui est, ils ont tous les deux "allouer de la mémoire".Cependant,
new
/delete
effectuer arbitraire d'autres travaux en plus, par les constructeurs, destructeurs et la surcharge d'opérateur.malloc
/free
jamais d'allouer et de libérer de la mémoire.En fait,
new
est suffisamment personnalisable qu'il n'est pas nécessairement le retour de la mémoire dans le tas, ou même d'allouer de la mémoire à tous. Toutefois, le défautnew
n'.La principale différence entre la nouvelle et le malloc est que les nouveaux invoque le constructeur de l'objet et de l'appel correspondant à supprimer appelle le destructeur de l'objet.
Il y a 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 positionne errnonew
est un opérateur et peut être surchargée,malloc
est une fonction et ne peut pas être surchargénew[]
, qui alloue des tableaux, plus intuitif et le type de sécurité que lesmalloc
malloc
dérivé des allocations peuvent être redimensionnées parrealloc
,new
dérivés allocations ne peuvent pas être redimensionnéesmalloc
pouvez attribuer un N-octet partie de la mémoire,new
doit être demandé d'allouer un tableau de, disons,char
typesD'observer les différences, un résumé est malloc est C-esque, la nouvelle est C++-esque. Utilisez celui qui se sent le droit pour votre base de code.
Même si il est légal pour les nouveaux et les malloc pour être mis en œuvre à l'aide de différents algorithmes d'allocation de mémoire, sur la plupart des systèmes de nouveau, c'est en interne mis en œuvre à l'aide de malloc, produisant pas de système de niveau de différence.
Il y a quelques choses qui
new
n'est quemalloc
n'est pas le cas:new
constructions de l'objet en appelant le constructeur de cet objetnew
ne nécessite pas de typecasting de mémoire allouée.les objets à construire.
Donc, si vous utilisez
malloc
, alors vous devez faire au-dessus des choses explicitement, ce qui n'est pas toujours pratique. En outre,new
peut être surchargé maismalloc
peut pas l'être.En un mot, si vous utilisez C++, essayez d'utiliser
new
autant que possible.aussi,
la global new et delete peuvent être remplacées, malloc/free ne peut pas.
encore plus new et delete peuvent être remplacées par type.
new
etdelete
le C++ primitives qui déclarent une nouvelle instance d'une classe ou de les supprimer (ainsi, en invoquant le destructeur de la classe de l'instance).malloc
etfree
sont C fonctions et ils allouer et libérer des blocs de mémoire (en taille).Les deux utilisent le tas pour faire la répartition.
malloc
etfree
sont néanmoins plus "bas niveau" comme ils ont juste réserver une partie de la mémoire de l'espace qui sera probablement associé à un pointeur. Pas de structures sont créées autour de ce mémoire (sauf si vous considérez un C tableau à une structure).new et delete sont des opérateurs en c++, qui peut être trop surchargé.
malloc et free sont fonction en c;
malloc renvoie null ptr quand il échoue tout nouveau throws exception.
adresse retournée par malloc besoin par type coulé à nouveau comme il renvoie le (void*)malloc(taille)
Nouveau retourner le pointeur typé.
malloc()
, nous avons besoin de inclure<stdlib.h>
ou<alloc.h>
dans le programme qui n'est pas nécessaire pournew
.new
etdelete
peut être surchargé maismalloc
ne peut pas.new
, nous pouvons passer l'adresse de l'endroit où nous voulonsallouer de la mémoire, mais ce n'est pas possible en cas de
malloc
.alloc.h
n'est pas un en-tête standard.<new>
est nécessaire pour utiliser le placement de nouvelles.Ce code pour l'utilisation de supprimer le mot-clé ou une fonction. Mais lors de la création d'un
pointeur de l'objet à l'aide de 'malloc' ou 'nouveau' et de désallouer la mémoire d'objet à l'aide de
supprimer même que le pointeur d'objet peut être appeler la fonction dans la classe. Après
que utiliser gratuit au lieu de supprimer puis aussi il fonctionne après instruction ,
mais lors de l'utilisation à la fois, puis seulement pointeur de l'objet ne peut pas appel à la fonction dans la classe..
le code est comme suit :
1.nouveau syntex est plus simple que la fonction malloc()
2.new/delete est un opérateur où malloc()/free()
est une fonction.
3.nouveau/supprimer l'exécution est plus rapide que la fonction malloc()/free (), parce que de nouveaux assemly code directement collés par le compilateur.
4.nous pouvons changer de new/delete sens dans le programme avec l'aide de l'opérateur overlading.