C++: la Sécurité dans l'utilisation de longjmp et setjmp?
Est-il sécuritaire d'utiliser longjmp et setjmp en C++ sur linux/gcc en ce qui concerne les éléments suivants?
- La gestion des exceptions (je ne suis pas la mise en œuvre de la gestion des exceptions en utilisant longjmp/setjmp. Je veux savoir quels sont les effets secondaires longjmp/setjmp aura sur la norme de gestion des exceptions)
*this
pointeur- Signaux
- Des pointeurs intelligents (boost partagé et l'intrusion de pointeurs)
- Autre chose que vous pouvez penser.
Vous devez vous connecter pour publier un commentaire.
setjmp()
/longjmp()
complètement renverser le déroulement de pile et, par conséquent, la gestion des exceptions ainsi que RAII (destructeurs en général).De 18,7/4 "Autre support d'exécution" dans la norme:
De sorte que la ligne de fond est que
setjmp()
/longjmp()
ne joue pas bien en C++.longjmp()
saute vers un nouvel emplacement dans le code, de sorte qu'il ne fournira aucune chance pour le dtors à être appelé. La norme est en fait moins précis que le que le standard ne veut pas dire que dtors ne sera pas appelé, il dit que tous les paris sont éteints. Vous ne pouvez pas dépendre d'un comportement particulier dans ce cas.longjmp()
aussi longtemps que vous n'avez pas longjmp de code qui devrait provoquer dtors être invoquée. Cependant, comme David Thornley a fait remarquer dans un commentaire, setjmp()/longjmp() peut être difficile à utiliser, même en ligne droite C en C++, ils sont carrément dangereux. Éviter si possible.std::vector
etstd::string
pas de libérer sa mémoire,std::fstream
pas la fermeture de son dossier et des choses comme cela.Ce n'est pas spécifique à Linux ou gcc; setjmp /longjmp et C++ ne fonctionne pas trop bien ensemble, si vous utilisez longjmp de laisser un contexte où il y a des variables automatiques avec des destructeurs.
Les destructeurs de ne pas exécuter ce qui peut entraîner une fuite de mémoire ou d'autres mauvais comportement.