usar sirven sencillos que punteros puntero para los funciones ejemplos dev como aritmetica c++ exception-handling throw try-catch

sirven - punteros en c++ ejemplos sencillos



captura excepción por puntero en C++ (5)

Descubrí que hay tres formas de atrapar una excepción, ¿cuáles son las diferencias?

1) captura por valor;

2) captura por referencia;

3) captura por puntero;

Solo sé que catch by value invocará dos copias del objeto, catch by reference invocará uno. Entonces, ¿qué hay de atrapar por puntero? ¿Cuándo usar la captura por puntero? Además de arrojar un objeto, ¿puedo arrojar un puntero a un objeto como este?

class A {} void f() { A *p = new A(); throw p; }


Catch sigue las reglas de compatibilidad de asignación normal, es decir, si arroja un valor, puede tomarlo como valor o referencia, pero no como puntero; si arroja un puntero, puede atraparlo solo como un puntero (o referencia a un puntero ...).

Pero realmente no tiene sentido arrojar punteros, solo causará dolores de cabeza en el manejo de la memoria. Por lo tanto, en general, debe seguir la regla arrojar por valor, capturar por referencia , como lo explica Gregory.


El MFC de Microsoft usa la captura por puntero, pero creo que eso fue por compatibilidad con el compilador antes de que try and catch se implementara correctamente; originalmente usaron las macros TRY y CATCH para simularlo. Cada excepción se deriva de CException, que tiene un método para determinar si el objeto necesita ser eliminado.

No lo recomendaría para ningún diseño de excepción moderno. La captura por referencia es el camino a seguir.


Realmente no hay un buen escenario para capturar / arrojar una excepción con un puntero. La semántica de C ++ lo permite, pero no es terriblemente útil, ya que la mayoría de las veces lanzará una excepción temporal u objeto de cadena.

Sin embargo, algunas bibliotecas (Boost.Graph hace esto, creo) usan throw para pasar un valor de retorno a la persona que llama desde una función profundamente recursada; en una situación como esta, el valor de retorno puede ser un puntero, por lo que arrojar un puntero tendría sentido.


Si bien es posible lanzar esencialmente cualquier objeto de cualquier tipo, hay poco (si es que hay algo) que ganar al hacer esto. La asignación dinámica es útil principalmente cuando un objeto necesita tener una vida útil no cabe con la asignación automática, es decir, desea que su duración sea independiente del alcance del programa normal.

En el caso de un objeto de excepción, sin embargo, eso realmente no tiene mucho sentido. Normalmente, un objeto de excepción solo se usa dentro de un manejador de excepciones, y claramente quiere que se destruya cuando salga del (último) controlador para esa excepción.

También está el hecho de que generalmente quiere mantener el código de manejo de excepciones bastante simple. Solo por ejemplo, si está tratando de informar que la tienda / montón está siendo agotada o corrupta, tratar de asignar su objeto de excepción a la tienda / montón gratuito agotado / corrupto generalmente no funcionará muy bien ...


La forma recomendada es arrojar por valor y capturar por referencia .

Su código de ejemplo arroja un puntero, lo cual es una mala idea, ya que tendría que administrar la memoria en el sitio de captura.

Si realmente siente que debe lanzar un puntero, use un puntero inteligente como shared_ptr .

De todos modos, Herb Sutter y Alexei Alexandrescu lo explican muy bien en su libro C ++ Coding Standards que parafraseé.

Consulte los estándares de codificación de C ++: lanzar por valor, captura por referencia .