web-dev-qa-db-fra.com

Quelle est la difference entre new/delete et malloc/free?

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

Related (duplicate?): Dans quels cas dois-je utiliser malloc vs new?

269
MrDatabase

nouveau/supprimer

  • Allouer/libérer de la mémoire
    1. Mémoire allouée à partir de 'Free Store'
    2. Retourne un pointeur entièrement typé.
    3. new (version standard) ne renvoie jamais une valeur NULL (lancera en cas d'échec)
    4. Sont appelés avec Type-ID (le compilateur calcule la taille)
    5. A une version explicitement pour gérer les tableaux.
    6. Réallocation (pour obtenir plus d'espace) non gérée de manière intuitive (à cause du constructeur de copie).
    7. Qu'ils s'appellent malloc/free ou non, l'implémentation est définie.
    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 'Heap'
    2. Retourne un vide *
    3. Retourne NULL en cas d'échec
    4. Doit spécifier la taille requise en octets.
    5. L'allocation d'un tableau nécessite un calcul manuel de l'espace.
    6. Réaffecter plus gros morceau de mémoire simple (aucun constructeur de copie à s'inquiéter)
    7. Ils vont NE PAS appeler nouveau/supprimer
    8. Pas moyen de scinder le code utilisateur dans la séquence d'allocation pour aider avec peu de mémoire.
    9. malloc/gratuit peut NE 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 domaines soient identiques est une mise en œuvre détaillée, ce qui est une autre raison pour laquelle malloc et new ne peuvent pas être mélangés.

444
Martin York

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

79
Trap

new appelle le ctor de l'objet, delete appelle le dtor.

malloc & free juste allouer et libérer de la mémoire brute.

29
James Curran

En C++ new/delete, appelez le constructeur/destructeur en conséquence.

malloc/free allouez simplement de la mémoire à partir du tas. new/delete allouer également de la mémoire.

13
Encryptic

new/delete est C++, malloc/free vient du bon vieux C.

En C++, new appelle un constructeur d'objets et delete appelle le destructeur. 

malloc et free, issus des âges sombres précédant OO, n'allouent et ne libèrent que la mémoire, sans exécuter aucun code de l'objet.

12
Treb

Les seules similitudes sont que malloc/new retournent tous les deux un pointeur qui adresse de la mémoire sur le tas, et ils garantissent qu'une fois qu'un bloc de mémoire a été renvoyé, il ne sera pas renvoyé à moins que vous ne le libériez/supprimiez d'abord. C'est-à-dire qu'ils "allouent" de la mémoire. 

Cependant, new/delete effectue en outre un travail arbitraire, via les constructeurs, les destructeurs et la surcharge d'opérateurs. malloc/free seulement allouer et libérer de la mémoire.

En fait, new est suffisamment personnalisable pour ne pas nécessairement restituer de la mémoire du tas, ni même allouer de la mémoire. Cependant, la valeur par défaut new le fait.

10
Steve Jessop

La principale différence entre new et malloc est que new appelle le constructeur de l'objet et que l'appel à supprimer correspondant invoque le destructeur de l'objet.

Il y a d'autres différences:

  • new est conforme au type, malloc renvoie des objets de type void*

  • new lève une exception en cas d'erreur, malloc renvoie NULL et définit errno

  • new 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 compatible avec le type 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

  • malloc peut allouer un bloc de mémoire de N octets. new doit être invité à allouer un tableau de, par exemple, char types

En regardant les différences, un résumé est malloc est C-esque, nouvelle C++ - esque. Utilisez celui qui convient à votre base de code.

Bien qu'il soit légal d'implémenter new et malloc en utilisant différents algorithmes d'allocation de mémoire, sur la plupart des systèmes, new est implémenté en interne en utilisant malloc, ce qui ne donne aucune différence au niveau du système.

6
Walter

new fait ce que malloc ne fait pas:

  1. new construit l'objet en appelant le constructeur de cet objet
  2. new ne nécessite pas de conversion de la mémoire allouée.
  3. Il n’est pas nécessaire d’allouer une quantité de mémoire, mais un 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, new peut être surchargé mais malloc ne le peut pas.

Dans un Word, si vous utilisez C++, essayez d'utiliser new autant que possible.

5
herohuyongtao

également,

le nouveau global et supprimer peuvent être remplacés, malloc/free ne peut pas.

en outre, plus de nouveaux et de supprimer peuvent être remplacés par type.

4
DanJ

new et delete sont C++ primitives qui déclarent une nouvelle instance d'une classe ou la suppriment (invoquant ainsi le destructeur de la classe pour l'instance).

malloc et free sont des fonctions Cet elles allouent et libèrent des blocs de mémoire (en taille).

Les deux utilisent le tas pour effectuer l'allocation. malloc et free sont néanmoins plus "bas niveau" car ils ne réservent qu'un bloc 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).

3
Jorge Córdoba

new et delete sont des opérateurs en c ++; qui peuvent être surchargés aussi . malloc et free fonctionnent en c;

malloc renvoie la valeur null ptr en cas d'échec du lancement d'une nouvelle exception.

adresse renvoyée par malloc doit être typée à nouveau, car elle renvoie le (void *) malloc (taille) New retourne le pointeur saisi.

2
VishalTiwari
  • new est un opérateur, alors que malloc () est une fonction.
  • new retourne le type de données exact, alors que malloc () retourne void * (pointeur de type void).
  • malloc (), la mémoire n'est pas initialisée et la valeur par défaut est garbage, alors que dans le cas d'un nouveau, la mémoire est initialisée avec la valeur par défaut, comme avec 'zéro (0)' dans le cas où int est.
  • delete et free () peuvent être utilisés pour les pointeurs 'NULL'.
2
Anurag Singh
  • Pour utiliser malloc(), nous devons inclure <stdlib.h> ou <alloc.h> dans le programme qui n’est pas requis pour new.
  • new et delete peuvent être surchargés mais malloc ne le peut pas.
  • En utilisant l'emplacement new, nous pouvons passer l'adresse où nous voulons allouer de la mémoire, mais cela n'est pas possible dans le cas de malloc.
1
ron davis

Ce code d'utilisation du mot-clé delete ou de la fonction free. Mais lorsque vous créez un objet pointeur en utilisant 'malloc' ou 'new' et libérez la mémoire d'objet en utilisant Delete, même ce pointeur d'objet peut être appelé fonction dans la classe. Après Qui utilise free au lieu de delete, cela fonctionne également après l'instruction free, Mais lorsque les deux sont utilisés, seul l'objet pointeur ne peut pas appeler fonction 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
0
chirag kadam