Maison  >  Article  >  développement back-end  >  Quel est le comportement du « nouvel » opérateur dans différents compilateurs C, en particulier en ce qui concerne l’échec de l’allocation de mémoire ?

Quel est le comportement du « nouvel » opérateur dans différents compilateurs C, en particulier en ce qui concerne l’échec de l’allocation de mémoire ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-17 20:14:02541parcourir

What is the Behavior of the `new` Operator in Different C   Compilers, Especially Regarding Memory Allocation Failure?

New Ever Return NULL ?

En C , l'opérateur new est responsable de l'allocation de mémoire pour les nouveaux objets. Selon la norme C, si new ne parvient pas à allouer de la mémoire, il est censé lever une exception std::bad_alloc. Cependant, il y a eu des rumeurs selon lesquelles certains compilateurs, tels que Visual C 6 (VC6), s'écartent de ce comportement.

Non-conformité de VC6

Les rumeurs sont vraies . VC6, par défaut, n'adhère pas à la norme C à cet égard. Lorsque new ne parvenait pas à allouer de la mémoire, il renvoyait 0 (ou NULL) au lieu de lever une exception.

Solution de contournement de Microsoft

Microsoft a reconnu ce problème et a proposé une solution de contournement : en utilisant un nouveau gestionnaire personnalisé. Les développeurs pourraient spécifier leur propre implémentation de l'opérateur new qui lancerait une exception std::bad_alloc au lieu de renvoyer 0.

Compilateurs MSVC ultérieurs

Dans les versions ultérieures de MSVC ( à partir de la version 7.0), le comportement de new est devenu plus complexe. Il y avait un ensemble de règles qui déterminaient s'il lèverait une exception ou renverrait 0.

VS2005 et au-delà

Avec VS2005 (MSVC 8.0), Microsoft a finalement nettoyé ce comportement. Par défaut, new lève désormais une exception std::bad_alloc à moins qu'il ne soit explicitement lié à nothrownew.obj.

Approche alternative : std::nothrow

Les développeurs peuvent également spécifier que ils veulent que new renvoie 0 au lieu de lever une exception en utilisant le paramètre std::nothrow. Cela permet un comportement cohérent entre les compilateurs, même avec le code existant écrit pour VC6.

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!

Déclaration:
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