72 votes

Comment gérer bad_alloc en C++ ?

Il existe une méthode appelée foo qui renvoie parfois l'erreur suivante :

 terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Abort

Existe-t-il un moyen d'utiliser un try - catch pour empêcher cette erreur de terminer mon programme (tout ce que je veux faire, c'est retourner -1 ) ?

Si oui, quelle est sa syntaxe ?

Sinon, comment puis-je gérer bad_alloc en C++ ?

41voto

Flexo Points 39273

Vous pouvez l'attraper comme n'importe quelle autre exception :

 try {
  foo();
}
catch (const std::bad_alloc&) {
  return -1;
}

Tout ce que vous pouvez faire utilement à partir de ce point dépend de vous, mais c'est certainement techniquement faisable.

9voto

Sam Miller Points 14976

Je ne suggérerais pas cela, car bad_alloc signifie que vous manquez de mémoire . Il serait préférable d'abandonner au lieu d'essayer de récupérer. Cependant voici la solution que vous demandez :

 try {
    foo();
} catch ( const std::bad_alloc& e ) {
    return -1;
}

5voto

TrueY Points 2676

Je peux suggérer une solution plus simple (et encore plus rapide) pour cela. new renverrait null si la mémoire ne pouvait pas être allouée.

 int fv() {
    T* p = new (std::nothrow) T[1000000];
    if (!p) return -1;
    do_something(p);
    delete p;
    return 0;
}

J'espère que cela pourra aider !

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