web-dev-qa-db-fra.com

Quelle est la différence entre "nouveau" et "malloc" et "calloc" en C ++?

Quelle est la différence entre "nouveau" et "malloc" et "calloc" et les autres membres de la famille?

(Quand) Ai-je besoin d'autre chose que de "nouveau"?

L'un d'eux est-il implémenté en utilisant un autre?

51
Łukasz Lew

new et delete sont des fonctionnalités spécifiques à C++. Ils n'existaient pas en C. malloc est la manière C traditionnelle de faire les choses. La plupart du temps, vous n'aurez pas besoin de l'utiliser en C++.

  • malloc alloue de la mémoire non initialisée. La mémoire allouée doit être libérée avec free.
  • calloc est comme malloc mais initialise la mémoire allouée avec une constante (0). Il doit être libéré avec free.
  • new initialise la mémoire allouée en appelant le constructeur (s'il s'agit d'un objet). La mémoire allouée avec new doit être libérée avec delete (qui à son tour appelle le destructeur). Il n'est pas nécessaire que vous spécifiez manuellement la taille dont vous avez besoin et que vous la convertissiez en type approprié. Ainsi, il est plus moderne et moins sujet aux erreurs.
71
Mehrdad Afshari

nouveau/supprimer + nouveau []/supprimer []:

  • new/delete est la façon C++ d'allouer de la mémoire et de désallouer la mémoire du tas.
  • new [] et delete [] est la façon c ++ d'allouer des tableaux de mémoire contiguë.
  • Doit être utilisé car il est plus sûr que le type malloc
  • Doit être utilisé car il appelle le constructeur/destructeur
  • Ne peut pas être utilisé de manière réallouée, mais peut utiliser placement new pour réutiliser le même tampon de données
  • Les données ne peuvent pas être allouées avec nouveau et libérées avec gratuit, ni supprimer []

malloc/free + family:

  • malloc/free/family est le moyen C d'allouer et de libérer de la mémoire à partir du tas.
  • calloc est le même que malloc mais initialise également la mémoire
  • À utiliser si vous devez réallouer la mémoire
  • Les données ne peuvent pas être allouées avec malloc et libérées avec delete ni delete []

Voir aussi mon réponse connexe ici

20
Brian R. Bondy
  • new alloue et appelle ctor (l'ordre n'est pas spécifié), supprime le dtor et libère la mémoire allouée par un appel à new
  • malloc alloue uniquement de la mémoire, la mémoire libre est supprimée par malloc
  • nouveau peut être implémenté en utilisant malloc (non requis par la norme)
  • calloc fait la même chose que malloc et remet également à zéro la mémoire nouvellement allouée

Comme d'autres articles l'ont souligné: malloc/free fait partie de C++ pour être compatible avec C.

Voir aussi: Stroustrup: new vs malloc

8
dirkgently

L'utilisation de nouveaux moyens signifie que les constructeurs seront appelés sur la mémoire nouvellement allouée. Si la chose allouée n'a pas de constructeurs, new est fonctionnellement identique à malloc. et devrait normalement être utilisé par rapport à lui.

nouveau peut ou non être implémenté en termes de malloc - la norme C++ ne nécessite aucune des deux approches.

5
anon

Vous n'avez besoin de rien d'autre que du neuf. Il s'agit d'un remplacement complet de malloc en C++.

Quant à la différence: Malloc alloue simplement de la mémoire. Nouvelle mémoire allouée et appelle les constructeurs. De même, free libère juste la mémoire. Supprimer libère la mémoire et appelle le destructeur.

Un mot d'avertissement: ne mélangez pas les deux idiomes. Les résultats ne sont pas définis.

5
Steve Rowe

la principale différence entre new et malloc dont je me souvienne est que vous ne pouvez pas réallouer la mémoire allouée par new en utilisant realloc. Donc, si vous vouliez augmenter/diminuer la taille du bloc mémoire, vous deviez allouer un nouveau bloc et tout recopier.

Calloc vous permet d'initialiser le bloc de mémoire que vous allouez, contrairement à malloc.

1
z -

Lorsque vous nouvea un objet, l'espace pour l'objet n'est pas seulement alloué mais le constructeur de l'objet est appelé. Mais c'est la façon dont C++ est fait, malloc est l'ancienne version ( [~ # ~] c [~ # ~] d'allocation de mémoire. calloc est le même que malloc, sauf qu'il efface la mémoire de tous les bits zéro.

1
TStamper