2011-04-03 4 views
8

Possible en double:
throwing exceptions of objects on the stack, mem leak with new?C++ -La bonne façon de lancer et attraper des exceptions

-vous lancer des exceptions en C++ avec ou sans l'opérateur new? Parce que les deux jetteraient une exception.

void KillUnicorns() 
{ 
    throw IllegalActionException(); 
} 

int main() 
{ 
    try 
    { 
     KillUnicorns(); 
    } 
    catch (IllegalActionException e) 
    { 
     // Handle exception 
    } 
    return 0; 
} 

Bien que l'exemple suivant fuirait la mémoire?

void KillUnicorns() 
{ 
    throw new IllegalActionException(); 
} 

int main() 
{ 
    try 
    { 
     KillUnicorns(); 
    } 
    catch (IllegalActionException* e) 
    { 
     // Handle exception 
    } 
    return 0; 
} 

Quelle est la bonne façon de lancer des exceptions en C++?

Répondre

9

Je jetterais exception sans utiliser new:

void KillUnicorns() 
{ 
    throw IllegalActionException(); 
} 

et serait-il catch avec const référence, comme:

catch (const IllegalActionException & e) 
{ // ^^^^ note const    ^^ note reference! 

} 

Il évite la copie. Il évite new, et vous évite ainsi d'utiliser delete.

+1

Une petite question asside. Est-ce que 'const IllegalActionException & e' obtient le même résultat que' IllegalActionException const & e'? Comme vu dans le commentaire de @ Martin. – Kevin

+2

@ Kevin: préfixer ou postfaire le cosnt à un type est une question de style (vous pouvez voir les deux autour). Le résultat est identique. –

8

Techniquement, vous pouvez faire les deux.

Mais plus traditionnel à lancer des objets:
noter également les captures par référence const (ce qui empêche le découpage de l'exception)

try 
{ 
    KillUnicorns(); 
} 
catch (IllegalActionException const& e) 
{       // ^^^^^^^^ 
    // Handle exception 
} 
+5

+1. Juste pour ajouter, la mémoire est habituellement réservée aux objets d'exception. Si vous effectuez une allocation dynamique, vous utilisez cette mémoire pour le pointeur, mais essayez toujours l'allocation dynamique standard (sur "le tas", si votre implémentation en utilise une). Si la cause de l'exception est que vous manquez de mémoire, c'est ... pas génial. Aussi, bien sûr, vous créez un désordre pour vous-même w.r.t. libérer cette mémoire plus tard. –

Questions connexes