C ++: sicuro usare longjmp e setjmp?

È sicuro usare longjmp e setjmp in C ++ su linux / gcc per quanto riguarda il seguente?

  1. Gestione delle eccezioni (non sto implementando la gestione delle eccezioni usando longjmp / setjmp. Voglio sapere quali effetti collaterali longjmp / setjmp avranno sulla gestione delle eccezioni standard)
  2. *this puntatore
  3. segnali
  4. Puntatori intelligenti (puntatori condivisi e intrusivi di boost)
  5. Qualsiasi altra cosa tu possa pensare.

setjmp() / longjmp() completamente lo longjmp() e quindi la gestione delle eccezioni e RAII (distruttori in generale).

Da 18.7 / 4 “Altri supporti di runtime” nello standard:

Se qualche object automatico viene distrutto da un’eccezione generata che trasferisce il controllo su un altro punto (destinazione) nel programma, allora una chiamata a longjmp(jbuf, val) al punto di lancio che trasferisce il controllo allo stesso punto (destinazione) ha un comportamento non definito .

Quindi la linea di fondo è che setjmp() / longjmp() non gioca bene in C ++.

Non è specifico per Linux o gcc; setjmp / longjmp e C ++ non funzionano molto bene insieme se stai usando longjmp per lasciare un contesto in cui ci sono variabili automatiche con distruttori.

I distruttori non funzioneranno, il che potrebbe causare perdite di memoria o altri comportamenti scorretti.

Ho solo imparato a conoscere questi comandi e non li ho mai visti in azione in applicazioni reali.

IMHO, è sicuro dire che non è sicuro usarli: gli sviluppatori non capiranno cosa fanno quelle API “impopolari”.