signal - C++: ¿es seguro usar longjmp y setjmp?
que es una biblioteca en c++ (3)
No es específico de Linux o gcc; setjmp / longjmp y C ++ no funcionan demasiado bien si está usando longjmp para dejar un contexto donde hay variables automáticas con destructores.
Los destructores no se ejecutarán, lo que puede provocar una pérdida de memoria u otro comportamiento incorrecto.
¿Es seguro usar longjmp y setjmp en C ++ en linux / gcc con respecto a lo siguiente?
- Manejo de excepciones (no estoy implementando el manejo de excepciones usando longjmp / setjmp. Quiero saber qué efectos secundarios tendrá longjmp / setjmp en el manejo de excepciones estándar)
-
*this
puntero - Señales
- Punteros inteligentes (punteros compartidos e intrusivos de boost)
- Cualquier otra cosa que puedas pensar
Solo he aprendido sobre esos comandos, y nunca los he visto en acción en aplicaciones reales.
En mi humilde opinión, es seguro decir que no es seguro usarlos: los desarrolladores no entenderán lo que hacen esas API "impopulares".
setjmp()
/ longjmp()
anula por completo el desenrollado de la pila y, por lo tanto, el manejo de excepciones, así como RAII (destructores en general).
Desde 18.7 / 4 "Otros soporte de tiempo de ejecución" en el estándar:
Si cualquier objeto automático sería destruido por una excepción lanzada transfiriendo control a otro punto (destino) en el programa, entonces una llamada a
longjmp(jbuf, val)
en el punto de lanzamiento que transfiere el control al mismo punto (destino) tiene un comportamiento indefinido .
Entonces, la conclusión es que setjmp()
/ longjmp()
no funcionan bien en C ++.