Partager via


/Zc:throwingNew (Supposer de nouvelles levées d’exception de l’opérateur)

Lorsque l’option /Zc :throwingNew est spécifiée, le compilateur optimise les appels pour operator new ignorer les case activée s pour un retour de pointeur Null. Cette option indique au compilateur de supposer que toutes les implémentations liées et operator new tous les allocateurs personnalisés sont conformes à la norme C++ et lèvent en cas d’échec d’allocation. Par défaut, dans Visual Studio, le compilateur génère des case activée null (/Zc :throwingNew-) pour ces appels, car les utilisateurs peuvent établir un lien avec une implémentation non levée de routines d’allocator operator new personnalisées ou écrire des routines d’allocator personnalisées qui retournent des pointeurs Null.

Syntaxe

/Zc :throwingNew[-]

Notes

Depuis ISO C++98, la norme a spécifié que l’opérateur par défaut lève de nouvelles levées std::bad_alloc en cas d’échec de l’allocation de mémoire. Les versions de Visual C++ jusqu’à Visual Studio 6.0 ont retourné un pointeur Null en cas d’échec d’allocation. À compter de Visual Studio 2002, operator new est conforme à la norme et lève en cas d’échec. Pour prendre en charge le code qui utilise l’ancien style d’allocation, Visual Studio fournit une implémentation pouvant être liée de operator new nothrownew.obj qui retourne un pointeur Null en cas d’échec. Par défaut, le compilateur génère également des case activée null défensives pour empêcher ces allocateurs de style plus ancien de provoquer un incident immédiat en cas d’échec. L’option /Zc :throwingNew indique au compilateur d’abandonner ces case activée null, en supposant que tous les allocateurs de mémoire liés sont conformes à la norme. Cela ne s’applique pas aux surcharges explicites non levées operator new , déclarées à l’aide d’un paramètre de type std::nothrow_t supplémentaire et qui ont une spécification explicite noexcept .

Conceptuellement, pour créer un objet sur le magasin gratuit, le compilateur génère du code pour allouer sa mémoire, puis pour appeler son constructeur pour initialiser la mémoire. Étant donné que le compilateur MSVC ne peut normalement pas savoir si ce code sera lié à un allocateur non conforme et non-levée, par défaut, il génère également une case activée Null avant d’appeler le constructeur. Cela empêche une déréférencement de pointeur Null dans l’appel du constructeur si une allocation non levée échoue. Dans la plupart des cas, ces case activée sont inutiles, car les allocateurs par défaut operator new lèvent au lieu de retourner des pointeurs Null. Les case activée ont également des effets secondaires malheureux. Ils gonflent la taille du code, ils inondent le prédicteur de branche, et ils empêchent d’autres optimisations de compilateur utiles telles que la dévirtualisation ou la propagation const hors de l’objet initialisé. Les case activée existent uniquement pour prendre en charge le code lié à nothrownew.obj ou qui a des implémentations personnalisées non conformesoperator new. Si vous n’utilisez pas de non-conformité operator new, nous vous recommandons d’utiliser /Zc :throwingNew pour optimiser votre code.

L’option /Zc :throwingNew est désactivée par défaut et n’est pas affectée par l’option /permissive- .

Si vous compilez à l’aide de la génération de code au moment du lien (LTCG), vous n’avez pas besoin de spécifier /Zc :throwingNew. Lorsque votre code est compilé à l’aide de LTCG, le compilateur peut détecter si la valeur par défaut est utilisée.operator new Si c’est le cas, le compilateur quitte automatiquement les case activée null. L’éditeur de liens recherche l’indicateur /ThrowingNew pour indiquer si l’implémentation est operator new conforme. Vous pouvez spécifier cet indicateur à l’éditeur de liens en incluant cette directive dans la source de votre nouvelle implémentation d’opérateur personnalisé :

#pragma comment(linker, "/ThrowingNew")

Pour plus d’informations sur les problèmes de conformité dans Visual C++, consultez Nonstandard Behavior.

Pour définir cette option du compilateur dans l'environnement de développement Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.

  2. Dans le menu déroulant Configuration , choisissez Toutes les configurations.

  3. Sélectionnez la page de propriétés Propriétés de configuration>C/C++>Ligne de commande.

  4. Modifiez la propriété Options supplémentaires pour inclure /Zc :throwingNew ou /Zc :throwingNew, puis choisissez OK.

Voir aussi

Options du compilateur MSVC
Syntaxe de la ligne de commande du compilateur MSVC
/Zc (Conformité)
noexcept (C++)
Spécifications d’exception (throw) (C++)
terminate (exception)