Maison >développement back-end >C++ >Pourquoi « new » renvoie-t-il parfois NULL au lieu de lancer une exception ?

Pourquoi « new » renvoie-t-il parfois NULL au lieu de lancer une exception ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-21 17:53:12921parcourir

Why Does `new` Sometimes Return NULL Instead of Throwing an Exception?

New() lève une exception NULL : conformité du compilateur

La norme C exige que le nouvel opérateur lève une exception std::bad_alloc lorsque il ne parvient pas à allouer de la mémoire. Cependant, des inquiétudes ont été soulevées quant au comportement de certains compilateurs, en particulier VC6, qui pourraient ne pas adhérer à cette norme.

Non-conformité de VC6

Dans le cas de VC6, il a été confirmé que le nouvel opérateur ne suivait effectivement pas la norme par défaut. Au lieu de cela, il a renvoyé 0 (NULL) en cas d'échec. Ce comportement posait des problèmes aux développeurs car il nécessitait des vérifications explicites de NULL après chaque nouvelle instruction, rendant le code esthétiquement peu attrayant.

Réponse et solutions de contournement de Microsoft

Microsoft a reconnu ce non -conformité et fourni une solution de contournement à l'aide d'un nouveau gestionnaire personnalisé. Alternativement, les développeurs peuvent exploiter le fichier objet nothrownew.obj pour imiter le comportement de VC6 dans les compilateurs MSVC plus récents (7.0 et versions ultérieures).

État actuel de conformité

Heureusement, dans MSVC 8.0 (VS2005), le comportement par défaut de new a été modifié pour adhérer à la norme et génère désormais un Exception std::bad_alloc en cas d'échec d'allocation de mémoire. Les liens vers nothrownew.obj ne sont nécessaires que si l'on souhaite le comportement original de type VC6.

Option de retour nul manuel

Les développeurs ont la possibilité de spécifier que le nouveau devrait renvoie 0 au lieu de lever une exception en utilisant le paramètre std::nothrow :

SomeType *p = new(std::nothrow) SomeType;

Cette technique permet un approche cohérente entre les compilateurs et simplifie la maintenance du code en éliminant le besoin de modifier les mécanismes de gestion des erreurs existants.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn