Maison > développement back-end > C++ > Votre compilateur C gère-t-il correctement les « nouvelles » exceptions d'opérateur ?

Votre compilateur C gère-t-il correctement les « nouvelles » exceptions d'opérateur ?

Linda Hamilton
Libérer: 2024-11-19 05:33:02
original
835 Les gens l'ont consulté

Does Your C   Compiler Correctly Handle `new` Operator Exceptions?

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!

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