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
Libérer: 2024-11-21 17:53:12
original
895 Les gens l'ont consulté

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal