Nouvelles exceptions de lancement : un examen de la conformité à la norme C
La norme C exige que le nouvel opérateur lève une exception std::bad_alloc si L'allocation de mémoire échoue. Cependant, des inquiétudes ont été soulevées quant au comportement de certains compilateurs, notamment VC6, à cet égard.
VC6 : Breaking the Standard
Confirmant les rumeurs, VC6 ne présente pas -comportement conforme. Au lieu de lever une exception en cas d'échec d'allocation, il renvoie une valeur 0 (ou NULL). Cet écart par rapport à la norme pose un défi potentiel aux développeurs car il nécessite des vérifications nulles explicites après chaque nouvel appel, ce qui entraîne des problèmes d'esthétique du code.
Une solution de contournement personnalisée pour VC6
Pour atténuer ce problème dans VC6, Microsoft propose une solution de contournement impliquant un nouveau gestionnaire personnalisé. Cette solution complète le comportement par défaut avec la gestion des exceptions.
Comportement des variables dans les compilateurs MSVC les plus récents
Dans les compilateurs MSVC à partir de la version 7.0, le comportement de new est plus complexe. Ces compilateurs peuvent adopter par défaut un comportement de lancement ou de non-lancement en fonction de règles spécifiques, y compris le lien vers le fichier objet nothrownew.obj.
Cohérence dans MSVC 8.0 et au-delà
Avec la sortie de MSVC 8.0 (VS2005), une approche plus cohérente a été adoptée. Ce compilateur lance toujours par défaut de nouvelles exceptions à moins qu'elles ne soient explicitement liées à nothrownew.obj.
Utilisation de std::nothrow pour un comportement de non-lancement
Les développeurs peuvent explicitement demander cette nouvelle renvoie 0 plutôt que de lancer une exception en utilisant le paramètre std::nothrow. Cela permet une compatibilité descendante avec le code existant écrit pour le comportement VC6.
En comprenant ces nuances et en mettant en œuvre des solutions de contournement appropriées, les développeurs peuvent garantir que leur code C adhère à la norme, quel que soit le compilateur qu'ils utilisent.
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!