Quelle est la différence entre new/delete et malloc/free?
Quelle est la différence entre new
/ delete
et malloc
/ free
?
(en double?): Dans quels cas dois-je utiliser malloc vs nouvelle?
15 réponses
Nouveau / supprimer
- Allouer/libération de la mémoire
- Mémoire allouée à partir de 'Free Store'
- renvoie un pointeur entièrement tapé.
- (standard version) ne jamais renvoie une valeur NULL (va jeter sur l'échec)
- sont appelés avec Type-ID (compilateur calcule la taille)
- a une version explicitement pour gérer les tableaux.
- réallocation (pour obtenir plus d'Espace) pas manipulé intuitivement (à cause du constructeur de copie).
- S'ils appellent malloc/free est la mise en œuvre définie.
- peut ajouter un nouvel allocateur de mémoire pour traiter la mémoire basse (set_new_handler)
- opérateur de new/delete peut être remplacée légalement
- constructeur / destructeur utilisé pour initialiser / détruire l'objet
malloc / free
- Alloue/libération de la mémoire
- mémoire attribuée à partir de "tas "
- Renvoie un void*
- Renvoie NULL en cas d'échec
- Doit spécifier la taille en octets.
- l'Allocation de tableau nécessite le calcul manuel de l'espace.
- réattribuer une plus grande partie de la mémoire simple (pas de constructeur de copie à s'inquiéter)
- Ils PAS appel de new/delete
- aucun moyen de coller du code utilisateur dans la séquence d'attribution pour aider avec la mémoire faible.
- malloc/free peut PAS être substituée légalement
Tableau de comparaison des caractéristiques:
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
mémoire techniquement attribuée par new vient du "Free Store" alors que la mémoire attribuée par malloc vient du "tas". La question de savoir si ces deux domaines sont 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 différence la plus importante est que l'opérateur new
attribue la mémoire puis appelle le constructeur, et delete
appelle le destructeur puis désalloque la mémoire.
new
appelle le directeur de l'objet, delete
appelle le dtor.
malloc
& free
il suffit d'allouer et de libérer la mémoire brute.
En C++ new
/ delete
appel au Constructeur/Destructeur en conséquence.
malloc
/ free
il suffit d'allouer la mémoire du tas. new
/ delete
attribuent aussi la mémoire.
new
/ delete
est C++, malloc
/ free
vient de bon vieux C.
En C++, new
les appels des objets constructeur et delete
appelle le destructeur.
malloc
et free
, provenant des âges sombres avant OO, n'attribuent et libèrent que la mémoire, sans exécuter aucun code de l'objet.
les seules similitudes sont que malloc
/ new
les deux renvoient un pointeur qui adresse une certaine 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 retourné à moins que vous le libériez/le supprimiez en premier. C'est-à-dire qu'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 de l'opérateur. malloc
/ free
jamais allouer et de libérer de la mémoire.
en fait, new
est suffisamment personnalisable qu'il ne renvoie pas nécessairement la mémoire du tas, ou même n'affecte pas la mémoire du tout. Cependant, la valeur par défaut new
le fait.
il y a quelques choses que new
fait que malloc
ne fait pas:
-
new
construit l'objet en appelant le constructeur de cet objet -
new
ne nécessite pas de typographie de la mémoire allouée. - Il ne nécessite pas une quantité de mémoire allouée, plutôt, il faut un certain nombre de les objets à construire.
donc, si vous utiliser malloc
, alors vous devez faire au-dessus des choses explicitement, ce qui n'est pas toujours pratique. De plus, new
peut être surchargé mais malloc
ne peut pas l'être.
En un mot, si vous utilisez C++, essayez d'utiliser new
autant que possible.
la principale différence entre new et malloc est que new invoque le constructeur de l'objet et l'appel correspondant à supprimer invoque 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
fait exception à l'erreur,malloc
retourneNULL
et sets errno -
new
est un opérateur et peut être surchargé,malloc
est une fonction et ne peut pas être surchargé -
new[]
, qui attribue des tableaux, est plus intuitif et de type-sûr quemalloc
-
malloc
-les allocations dérivées peuvent être redimensionnées parrealloc
,new
- allocations dérivées ne peut pas être redimensionné -
malloc
peut attribuer un N-octet partie de la mémoire,new
doit être demandé d'allouer un tableau de, disons,char
types
en regardant les différences, un résumé est malloc est C-esque, nouveau est C++-esque. Utilisez celle qui semble la bonne pour votre base de code.
bien qu'il soit légal de mettre en œuvre New et malloc en utilisant différents les algorithmes d'allocation de mémoire, sur la plupart des nouveaux systèmes est mis en œuvre à l'interne en utilisant malloc, ne produisant aucune différence au niveau du système.
aussi,
la global new et delete peuvent être remplacées, malloc/free ne peut pas.
d'autres nouveaux et supprimer peuvent être dépassés par type.
new
et delete
C++ primitives qui déclare une nouvelle instance d'une classe ou de les supprimer (ainsi, en invoquant le destructeur de la classe de l'instance).
malloc
et free
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
et free
sont néanmoins plus "bas niveau" que 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 (à moins que vous ne considériez un tableau C comme une structure).
nouveau et supprimer sont des opérateurs en C++; qui peuvent être surchargés aussi. malloc et free sont des fonctions en c;
malloc renvoie null ptr en cas d'échec alors que new lance l'exception.
adresse retournée par malloc besoin de par type moulé à nouveau comme il renvoie le (vide*)malloc (taille) Nouveau retour le pointeur dactylographié.
- de nouvelles est un opérateur, alors que malloc() est une fucntion.
- New renvoie le type de données exact, tandis que malloc () renvoie void * (pointeur de type void).
- malloc(), la mémoire n'est pas initialisé et la valeur par défaut est des ordures, alors que dans le cas de la nouvelle, de la mémoire est initialisée avec la valeur par défaut, comme avec " zéro (0)' dans le cas où sur int.
- supprimer et free() les deux peuvent être utilisés pour la 'NULL' pointeurs.
- pour utiliser le
malloc()
, nous devons 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. - en utilisant le placement
new
, nous pouvons passer l'adresse où nous voulons attribuer la mémoire mais ce n'est pas possible dans le cas demalloc
.
ce code pour l'utilisation de supprimer le mot-clé ou la fonction libre. Mais lors de la création d'un objet pointeur utilisant 'malloc' ou 'new' et désallocate la mémoire de l'objet en utilisant supprimer même ce pointeur d'objet peut être fonction d'appel dans la classe. Après qui utilisent free au lieu de delete puis aussi cela fonctionne après la déclaration libre , mais quand utiliser les deux alors seulement l'objet pointeur ne peut pas appeler pour fonctionner 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
1.le nouveau syntex est plus simple que malloc ()
2.new/delete est un opérateur où malloc()/free() est une fonction.
3.nouveau / delete exécute plus rapidement que malloc () / free () parce que le nouveau code assemly est directement collé par le compilateur.
4.nous pouvons modifier la signification de new/delete dans le programme avec l'aide de operator overlading.