Vidéo: [PES 2016] How to fix Application not starting ( error 0xc0000142 ) 2024
Une fonction C ++ qui alloue des ressources localement peut avoir besoin d'intercepter une exception, de faire un traitement, puis de la réinsérer dans la chaîne de pile. Considérons l'exemple suivant:
void fileFunc () {ofstream * pOut = new ofstream ("Fichier.txt"); otherFunction (); delete pOut;}
Comme beaucoup de programmeurs le savent, la mémoire allouée par new n'est pas retournée automatiquement au tas. Si otherFunction () devait lancer une exception, le contrôle quitterait le programme sans invoquer delete, et la mémoire allouée au début de fileFunc () serait perdue.
Pour éviter ce problème, fileFunc () peut inclure une capture (…) pour intercepter toute exception levée:
void fileFunc () {ofstream * pOut = new ofstream ("Fichier.txt") essayez {otherFunction (); delete pOut;} catch (…) {delete pOut; throw}}
Dans cette phrase, fileFunc () retourne la mémoire allouée précédemment au tas. Cependant, il n'est pas en mesure de traiter le reste de l'exception car il n'a aucune idée de ce qui aurait pu mal se passer. Il ne sait même pas quel type d'objet il vient d'attraper.
Le mot-clé throw sans argument renvoie l'objet d'exception en cours de sauvegarde de la chaîne à une fonction qui peut correctement traiter l'erreur.