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?

257
demandé sur Community 2008-10-27 18:05:30

15 réponses

Nouveau / supprimer

  • Allouer/libération de la mémoire
    1. Mémoire allouée à partir de 'Free Store'
    2. renvoie un pointeur entièrement tapé.
    3. (standard version) ne jamais renvoie une valeur NULL (va jeter sur l'échec)
    4. sont appelés avec Type-ID (compilateur calcule la taille)
    5. a une version explicitement pour gérer les tableaux.
    6. réallocation (pour obtenir plus d'Espace) pas manipulé intuitivement (à cause du constructeur de copie).
    7. S'ils appellent malloc/free est la mise en œuvre définie.
    8. peut ajouter un nouvel allocateur de mémoire pour traiter la mémoire basse (set_new_handler)
    9. opérateur de new/delete peut être remplacée légalement
    10. constructeur / destructeur utilisé pour initialiser / détruire l'objet

malloc / free

  • Alloue/libération de la mémoire
    1. mémoire attribuée à partir de "tas "
    2. Renvoie un void*
    3. Renvoie NULL en cas d'échec
    4. Doit spécifier la taille en octets.
    5. l'Allocation de tableau nécessite le calcul manuel de l'espace.
    6. réattribuer une plus grande partie de la mémoire simple (pas de constructeur de copie à s'inquiéter)
    7. Ils PAS appel de new/delete
    8. aucun moyen de coller du code utilisateur dans la séquence d'attribution pour aider avec la mémoire faible.
    9. 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.

431
répondu Loki Astari 2015-11-05 06:11:38

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.

77
répondu Trap 2014-04-24 14:25:37

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.

27
répondu James Curran 2008-10-27 15:08:30

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.

13
répondu Encryptic 2014-04-24 14:26:48

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.

12
répondu Treb 2014-04-24 14:26:05

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.

9
répondu Steve Jessop 2014-04-24 14:27:27

il y a quelques choses que new fait que malloc ne fait pas:

  1. new construit l'objet en appelant le constructeur de cet objet
  2. new ne nécessite pas de typographie de la mémoire allouée.
  3. 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.

5
répondu herohuyongtao 2017-09-15 20:58:44

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 type void*

  • new fait exception à l'erreur, malloc retourne NULL 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 que malloc

  • malloc -les allocations dérivées peuvent être redimensionnées par realloc , 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.

5
répondu Walter 2017-09-15 21:02:51

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.

4
répondu DanJ 2008-10-27 15:35:53

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

3
répondu Jorge Córdoba 2011-12-01 21:44:12

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

2
répondu VishalTiwari 2015-09-10 11:13:28
  • 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.
2
répondu Anurag Singh 2015-12-19 06:26:17
  • pour utiliser le malloc() , nous devons inclure <stdlib.h> ou <alloc.h> dans le programme qui n'est pas nécessaire pour new .
  • new et delete peut être surchargé, mais malloc 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 de malloc .
1
répondu ron davis 2015-06-18 21:43:47

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
0
répondu chirag kadam 2017-11-12 11:08:45

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.

-3
répondu Nitesh 2017-07-15 14:45:18