Maison > Article > développement back-end > Est-ce que `new` lance toujours `std::bad_alloc` en C ?
Vraies exceptions : au-delà de la norme dans la gestion de la mémoire C
Contrairement au standard C, il a été signalé que certains compilateurs, tels que VC6, s'écarte du comportement attendu du renvoi des exceptions std :: bad_alloc lorsque l'allocation de nouveau échoue mémoire.
Généralement, lorsque new ne parvient pas à acquérir la mémoire demandée, il déclenche une exception std::bad_alloc, adhérant aux normes C établies. Cependant, dans le cas de VC6, une approche alternative a été adoptée.
Au lieu de renvoyer une exception, VC6 aurait renvoyé 0 (ou NULL) en cas d'échec d'allocation de mémoire. Ce comportement, qui diffère de la norme, pourrait entraîner de la confusion et des résultats inattendus dans le code.
Pour lutter contre ce problème, Microsoft a introduit un nouveau gestionnaire personnalisé comme solution recommandée. Cependant, dans Visual C 7.0 et 7.1 (VS2002 et VS2003), un ensemble complexe de règles déterminait si le nouveau se comporterait de manière à ne pas lancer ou à lancer.
Avec la sortie de Visual C 8.0 (VS2005), Microsoft a résolu le problème en appliquant une politique cohérente. Dans cette version, new lèverait toujours par défaut une exception, à moins qu'il ne soit explicitement lié au fichier objet nothrownew.obj.
Pour les développeurs travaillant avec un code plus ancien conçu pour VC6, le paramètre std::nothrow peut être utilisé pour imiter le comportement de new dans ce compilateur. En spécifiant new(std::nothrow), le code peut être modifié mécaniquement pour fonctionner de manière similaire sur différents compilateurs, éliminant ainsi le besoin de réviser 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!