Quelle est la différence entre new / delete et malloc / free?


Réponses:


466

nouveau / supprimer

  • Allouer / libérer de la mémoire
    1. Mémoire allouée à partir de «Free Store»
    2. Renvoie un pointeur entièrement tapé.
    3. new (version standard) ne retourne jamais un NULL (lancera en cas d'échec)
    4. Sont appelés avec Type-ID (le compilateur calcule la taille)
    5. A une version explicite pour gérer les tableaux.
    6. La réallocation (pour obtenir plus d'espace) n'est pas gérée de manière intuitive (en raison du constructeur de copie).
    7. Qu'ils appellent malloc / free est défini par l'implémentation.
    8. Peut ajouter un nouvel allocateur de mémoire pour gérer la mémoire insuffisante (set_new_handler)
    9. l'opérateur new / delete peut être annulé légalement
    10. constructeur / destructeur utilisé pour initialiser / détruire l'objet

malloc / gratuit

  • Alloue / libère de la mémoire
    1. Mémoire allouée à partir de «tas»
    2. Retourne un vide *
    3. Renvoie NULL en cas d'échec
    4. Doit spécifier la taille requise en octets.
    5. L'allocation de la matrice nécessite un calcul manuel de l'espace.
    6. Réallocation d'une plus grande partie de la mémoire simple (pas de constructeur de copie à vous soucier)
    7. Ils n'appelleront PAS nouveau / supprimer
    8. Aucun moyen de fusionner le code utilisateur dans la séquence d'allocation pour réduire la mémoire.
    9. malloc / free ne peut PAS être annulé légalement

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 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.


12
Quelqu'un peut-il modifier pour élaborer sur le "Free Store" par opposition au tas? Un tas de processus est un concept bien connu indépendant du langage (?) Au niveau du système d'exploitation; d'où vient le "Free Store"?
einpoklum

1
@einpoklum: Ce ne sont que des noms de zones de mémoire. Ni l'un ni l'autre n'a rien à voir avec le concept de langage connu sous le nom de "tas" ou le concept os de "tas de processus". C ++ est délibérément défini comme neutre sur la plate-forme / le système d'exploitation / le compilateur. Ainsi, l'utilisation d'un concept de système d'exploitation spécifique comme «tas de processus» compromettrait la flexibilité de la norme.
Martin York

4
@winterlight: C'était vrai, mais ce n'est plus le cas. Voir: linux.die.net/man/3/free If ptr is NULL, no operation is performed.
Martin York

2
@LokiAstari Cela ressemble à «tas», «magasin libre» et «mémoire / stockage dynamique» sont des synonymes: Dans A Tour of C ++ de Bjarne Stroustrup , il dit: «L' newopé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."
Max Heiber

2
@mheiber: Cela signifie qu'ils peuvent être les mêmes. Et plusieurs implémentations implémentent new en appelant malloc (notez que l'inverse n'est explicitement pas autorisé). Mais plusieurs implémentations maintiennent ces zones de mémoire complètement séparées. La raison pour laquelle ils sont également séparés est que cela permet d'optimiser le code de gestion de la mémoire C ++ d'une manière différente de la gestion de la mémoire C. Le fait est qu'ils pourraient être les mêmes, mais vous ne pouvez pas supposer qu'ils le sont.
Martin York

81

La différence la plus pertinente est que l' newopérateur alloue de la mémoire puis appelle le constructeur, et deleteappelle le destructeur puis libère la mémoire.


22
À proprement parler, le nouvel opérateur alloue simplement la mémoire. C'est la nouvelle expression qui appelle le nouvel opérateur, puis exécute le constructeur dans la mémoire allouée.
Don Wakefield,

Une autre différence est où la mémoire est allouée. J'ai récemment vu quelque part que malloc / free opère sur le tas, tandis que new / delete opère dans une autre zone de mémoire dont le nom m'échappe maintenant. (Il suffit de dire, cependant, que cet autre domaine peut probablement être considéré comme un autre tas.)
RobH

2
@mgb: Oui, vous avez raison de dire que les objets sont alloués sur le "tas d'application" ou sur la pile. Mais @RobH fait référence à ce que la norme appelle différentes parties du "tas d'applications". Il y a le "Heap" qui est l'endroit où malloc alloue de la mémoire et le "Free Store" d'où new alloue la mémoire. Bien que dans certaines implémentations, ces zones se chevauchent (il s'agit d'un détail d'implémentation).
Martin York

1
Votre déclaration est correcte à 100% mais ne répond tout simplement pas à la question posée, voir la réponse ci-dessous, il y a une raison pour laquelle elle vote plus que la vôtre.
Murali

1
Tout ce que j'essayais de dire, c'est qu'il devrait y avoir au moins une mention de malloc / free pour qu'il puisse être considéré comme une comparaison qui manquait à votre réponse. Néanmoins, c'est une déclaration pertinente et exacte, donc les votes positifs, j'espère que vous comprenez mon point. Quoi qu'il en soit, si seulement SO me permettait de reprendre mon vote négatif, je le ferais de tout cœur.
Murali

30

newappelle le ctor de l'objet, deleteappelez le dtor.

malloc& freejuste allouer et libérer la mémoire brute.


Qu'entendez-vous par mémoire brute?
Destructor

3
La mémoire brute n'a rien fait. Aucun objet n'y a encore été construit, rien n'y a été copié et, dans la plupart des cas, le contenu précédent n'a pas été écrasé.
James Curran

14

new/ deleteest C ++, malloc/ freevient du bon vieux C.

En C ++, newappelle un constructeur d'objets et deleteappelle le destructeur.

mallocet free, venant des âges sombres avant OO, alloue et libère uniquement la mémoire, sans exécuter aucun code de l'objet.


9
"Venant des âges sombres avant OO" sonne comme si vous laissiez entendre que les nouveaux / supprimer sont meilleurs que malloc / gratuit alors qu'en réalité, ni mieux ni pire, ils ont juste des utilisations différentes. Notez que je ne suis pas celui qui vous a voté, je suppose.
Graeme Perrow

13

En C ++ new/ deleteappelez le constructeur / destructeur en conséquence.

malloc/ freealloue simplement la mémoire du tas. new/ deleteallouer de la mémoire également.


10

Les seules similitudes sont que malloc/ les newdeux 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/ deleteeffectuer d'autres travaux arbitraires en plus, via les constructeurs, les destructeurs et la surcharge des opérateurs. malloc/ freeuniquement allouer et libérer de la mémoire.

En fait, newest 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 le newfait.


7

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:

  • newest de type sécurisé, mallocrenvoie des objets de typevoid*

  • newlève une exception en cas d'erreur, mallocretourne NULLet définit errno

  • newest un opérateur et peut être surchargé, mallocest une fonction et ne peut pas être surchargé

  • new[], qui alloue les tableaux, est plus intuitif et sûr pour les types 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

  • mallocpeut allouer un bloc de mémoire de N octets, newdoit être invité à allouer un tableau de, disons, chartypes

En 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.


5

Il y a quelques choses qui newne le mallocfont pas:

  1. new construit l'objet en appelant le constructeur de cet objet
  2. new ne nécessite pas de transtypage de la mémoire allouée.
  3. Il ne nécessite pas une quantité de mémoire à allouer, il nécessite plutôt un certain nombre d'objets à construire.

Donc, si vous utilisez malloc, vous devez faire les choses ci-dessus explicitement, ce qui n'est pas toujours pratique. De plus, newpeut être surchargé mais mallocne peut pas l'être.

En un mot, si vous utilisez C ++, essayez d'en utiliser newautant que possible.


4

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.


3

newet deletesont 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).

mallocet freesont des fonctions C qui allouent et libèrent des blocs de mémoire (en taille).

Les deux utilisent le tas pour effectuer l'allocation. mallocet freesont 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).


1
nouveau en C ++ ne déclare pas une instance d'une classe. Il en alloue (généralement) un à partir du tas et ne déclare rien. Vous pouvez déclarer une instance simplement en la déclarant, auquel cas elle se trouvera sur la pile, ou en globales, selon la durée de stockage de la déclaration.
Steve Jessop

Eh bien, il alloue l'espace mémoire pour la classe mais vous ne pouvez pas "déclarer" une classe dans la pile, pas dans le vrai sens du stockage de la classe dans la pile. La déclaration implique uniquement le pointeur vers la classe qui est toujours allouée dans la pile la mémoire réelle contenant la classe est dans le tas.
Jorge Córdoba

Oui, vous pouvez. Selon les balises de question, il s'agit de C ++, donc les objets peuvent aller sur la pile. Et nouveau n'est pas une déclaration, c'est une expression. Déclarer quelque chose et l'allouer sont des choses distinctes.
Steve Jessop

2

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é.


2
  • new est un opérateur, tandis que malloc () est une fonction.
  • 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ée et la valeur par défaut est garbage, alors qu'en cas de nouveau, la mémoire est initialisée avec la valeur par défaut, comme avec 'zero (0)' en cas sur int.
  • delete et free () peuvent tous deux être utilisés pour les pointeurs 'NULL'.

0
  • Pour utiliser le malloc(), nous devons inclure <stdlib.h> ou <alloc.h>dans le programme qui n'est pas requis pour new.
  • newet deletepeut être surchargé mais mallocne peut pas.
  • En utilisant le placement new, nous pouvons passer l'adresse où nous voulons allouer de la mémoire mais ce n'est pas possible en cas de malloc.

1
alloc.hn'est pas un en-tête standard. <new>est requis pour utiliser le placement nouveau.
MM

0

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:

#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;
}

production :

Hello
Hi
0x2abfef37cc20

-3

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.