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!