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:
-
newconstruit l'objet en appelant le constructeur de cet objet -
newne 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:
-
newest de type sécurisé,mallocrenvoie des objets de typevoid* -
newfait exception à l'erreur,mallocretourneNULLet sets errno -
newest un opérateur et peut être surchargé,mallocest 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é -
mallocpeut attribuer un N-octet partie de la mémoire,newdoit être demandé d'allouer un tableau de, disons,chartypes
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. -
newetdeletepeut être surchargé, maismallocne 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.