2011-04-03 24 views
8

Duplicar posibles:
throwing exceptions of objects on the stack, mem leak with new?C++ manera -El derecho a lanzar y atrapar excepciones

¿Tira excepciones en C++ con o sin el operador new? Porque ambos arrojarían una excepción.

void KillUnicorns() 
{ 
    throw IllegalActionException(); 
} 

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

Aunque el siguiente ejemplo podría perder memoria?

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

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

¿Cuál es la forma correcta de lanzar excepciones en C++?

Respuesta

9

que lanzaba una excepción sin utilizar new:

void KillUnicorns() 
{ 
    throw IllegalActionException(); 
} 

Y lo haría catch con referencia const, como:

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

} 

Evita la copia. Evita new, por lo que le ahorra el uso de delete.

+1

Una pregunta rápida asside. ¿'Const IllegalActionException & e' logra el mismo resultado que' IllegalActionException const & e'? Como se ve en el comentario de @Martin. – Kevin

+2

@ Kevin: prefijar o enviar el cosnt a un tipo es una cuestión de estilo (puede ver ambos alrededor). El resultado es idéntico. –

8

Técnicamente puedes hacer ambas cosas.

Pero más tradicional a lanzar objetos:
También tenga en cuenta las capturas por referencia constante (esto evita el corte de la excepción)

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

+1. Solo para agregar, la memoria generalmente se reserva para objetos de excepción. Si realiza la asignación dinámica, entonces está usando esa memoria para el puntero, pero aún está intentando la asignación dinámica estándar del pantano (en "el montón", si su implementación usa uno). Si la causa de la excepción es que te has quedado sin memoria, esto es ... no genial. También, por supuesto, estás creando un lío para ti mismo. liberando esa memoria más tarde. –

Cuestiones relacionadas