Question

Duplicate of: Dans quels cas dois-je utiliser malloc vs nouveau?

Il suffit de relire cette question:
Quelle est la différence entre ; nouveau " et & mall; malloc " et " calloc " en C ++?

J'ai vérifié les réponses mais personne n'a répondu à la question:

  • Quand utiliserais-je malloc au lieu de nouveau?

Il y a plusieurs raisons (je peux penser à deux).
Laissez le meilleur flotter vers le haut.

Était-ce utile?

La solution

Un couple auquel on pense:

  • Lorsque vous avez besoin que le code soit portable entre C ++ et C.
  • Lorsque vous allouez de la mémoire dans une bibliothèque pouvant être appelée à partir de C, le code C doit libérer l'allocation.

Autres conseils

De la FAQ Stroustrup sur new / malloc , j'ai posté sur ce fil de discussion:

  

Chaque fois que vous utilisez malloc (), vous devez envisager l’initialisation et la conversion du pointeur de retour en un type approprié. Vous devrez également déterminer si vous avez le nombre d'octets à utiliser. Il n'y a pas de différence de performance entre malloc () et new lorsque vous prenez en compte l'initialisation.

Cela devrait répondre à votre question.

La meilleure raison pour laquelle je peux penser à utiliser malloc en C ++ est lors de l'interaction avec une API C pure. Certaines API C avec lesquelles j'ai travaillé s'approprient la mémoire de certains paramètres. En tant que tels, ils sont responsables de la libération de la mémoire et par conséquent, la mémoire doit être libre et disponible via free. Malloc travaillera pour ce projet mais pas nécessairement nouvelle.

En C ++, presque jamais. new est généralement un wrapper autour de malloc qui appelle des constructeurs (le cas échéant).

Cependant, au moins avec Visual C ++ 2005 ou supérieur, à l'aide de malloc peut générer des vulnérabilités de sécurité par rapport aux nouvelles .

Considérez ce code:

MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));

Ils ont l’air équivalent. Cependant, le codegen du premier vérifie réellement un dépassement d'entier dans count * sizeof (MyStruct). Si count provient d'une source non fiable, il peut en résulter un dépassement d'entier entraînant une petite quantité de mémoire. alloué, mais quand vous utilisez le compte, vous dépassez le tampon.

Tout le monde a mentionné (en utilisant des mots légèrement différents) lors de l'utilisation d'une bibliothèque C qui utilisera free () et il y en a beaucoup autour.

L'autre situation que je vois est la suivante:

Lorsque vous concevez votre propre gestion de la mémoire (car, pour une raison quelconque, vous avez découvert par le biais de la modélisation que les valeurs par défaut ne sont pas suffisantes). Vous pouvez allouer un bloc de mémoire avec malloc et initialiser les objets dans les pools en utilisant placement new.

L’une des raisons est qu’en C ++, vous pouvez surcharger le nouvel opérateur.

Si vous voulez être sûr d'utiliser l'allocation de mémoire de la bibliothèque système dans votre code, vous pouvez utiliser malloc.

Un programmeur C ++ devrait rarement, voire jamais, avoir besoin d'appeler malloc. La seule raison pour laquelle je peux penser serait une API mal construite qui s'attendait à ce que vous passiez dans la mémoire de malloc'd parce que ce serait faire de la libre. Dans votre propre code, new devrait toujours être égal à malloc.

Si la mémoire doit être libérée par free () (dans votre code ou celui de quelqu'un d'autre), il est vachement nécessaire d'utiliser malloc.

Sinon, je ne suis pas sûr. Un cas artificiel est celui où vous ne voulez pas que le ou les destructeurs soient exécutés à la sortie, mais dans ce cas, vous devriez probablement avoir des objets qui ont un détracteur de toute façon.

Vous pouvez utiliser malloc lorsque vous ne souhaitez pas avoir à vous soucier de capturer des exceptions (ou d'utiliser une version non nouvelle de new).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top