57 votes

Avec "-no-exceptions", que se passe-t-il avec "new T"?

Je me demandais si new T jetterait toujours bad_alloc si je compilais mon programme en utilisant l'option -fno-exceptions pour désactiver le traitement des exceptions?

Ou bien le compilateur (GCC et clang prend-il en charge cette option) transformera-t-il implicitement l’utilisation de new T à new (nothrow) T ?

50voto

La façon dont je le comprends, operator new est défini par libstdc++. Maintenant, si vous compilez votre propre code avec -fno-exceptions, vous ne pouvez pas attraper toutes les exceptions, mais vous serez toujours de se lier à la version normale du libstdc++, qui ne lève une exception.

Donc oui, new T lèvera une exception, même avec -fno-exception.

Toutefois, si vous avez compilé libstdc++ avec -fno-exception ainsi, les choses deviennent différentes. Maintenant, new T impossible de lever une exception, mais, si je l'ai lu à la bibliothèque libstdc++ manuel de droit qu'il appellera abort() à la place.

Il semble que, si vous voulez que votre new T à retourner la valeur NULL en cas d'échec, le seul moyen est de spécifier explicitement nothrow...

31voto

nos Points 102226

Je ne peux pas donner une réponse définitive à tous les avantages autour de -fno-exceptions, seulement les observations sur une machine Linux 32 bits, gcc 4.5.1 - bad_alloc est lancé avec et sans -fno-exceptions

 [21:38:35 1 ~/tmp] $ cat bad_alloc.cpp

int main()
{
    char* c = new char[4000000000U];
}
[21:38:58 1 ~/tmp] $ g++ bad_alloc.cpp
[21:39:06 1 ~/tmp] $ ./a.out
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted
[21:39:07 1 ~/tmp] $ g++ -fno-exceptions bad_alloc.cpp
[21:39:16 1 ~/tmp] $ ./a.out
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted
 

9voto

Michael Kristofik Points 16035

Ce n'est pas une réponse définitive, mais le Manuel de GCC (voir la section "Faire Sans") a ceci:

Avant de détailler la prise en charge bibliothèque pour -fno-exceptions, d'abord un passage note sur les choses perdues lorsque cet indicateur est utilisé: il va se casser les exceptions en essayant de passer à travers le code compilé avec -fno-exceptions si oui ou non ce code a toute try ou catch les constructions. Si vous pourriez avoir un certain le code qui en jette, vous ne devriez pas utiliser -fno-exceptions.

La façon dont j'ai lu cela, vous pourriez avoir à le demander explicitement le nothrow version de new pour être complètement sûr.

0voto

supercat Points 25534

Dans de nombreux exception des systèmes de gestion, si la routine "foo" appels "bar", qui à son tour appelle "moo", et "moo" déclenche une exception, la seule exception peut proprement le faire revenir à "foo" est si "bar" est le code pour gérer l'exception. Même si le "bar" est allons permettre à l'exception de propager non interceptée, il aura généralement pour s'assurer que ses variables locales correctement détruits avant l'exécution est autorisée à quitter son champ d'application. Cela nécessitera l'ajout de code pour "bar"; dans la plupart des systèmes, une partie de code à exécuter, même si aucune exception n'est levée.

BTW, sur certains processeurs ARM comme le Cortex M3, ou comme l'Arm7 cours d'exécution en mode de BRAS, si l'appelant est aussi être en cours d'exécution en mode de BRAS, on peut autoriser des exceptions sans aucun temps d'exécution de coût par une "normale" de retour de sous-routine aller à la LR+4 (quatre octets au-delà de la normale de l'adresse de retour) et d'avoir un exceptionnel la sortie de LR (ce qui serait alors un 4 octets direction de l'instruction). Un tel comportement serait contraire à l'usage normal sur le BRAS, cependant, une telle conception ne serait pas de port bien pour le Cortex M0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X