FAQ C++ moderne et erreurs courantes

Ce ou ces sujets font partie d'une FAQ en cours d'écriture, vos retours sont les bienvenus.
Rappel : une variable dite « locale » est une variable qui est détruite à la fin du scope dans lequel elle a été déclarée.
Que signifie « détruite » ?
En C++, cela conduit d'abord à un appel de son destructeur.
Cela signifie que la zone mémoire où la variable était stockée (et qui lui était jusqu'alors exclusivement réservée) est libérée. Cette zone peut dès lors être réutilisée à tout moment par une autre partie de votre programme pour y stocker une nouvelle variable.
Ayant conservé cette adresse (ou référence [C++]) désormais libérée (on parle dès lors de « dangling pointer/reference »), le danger réside dans son accès, que ce soit pour y lire ou écrire des données.
Un danger qui est amplifié lorsque cette zone n'apparaît pas encore réutilisée et que vous obtenez uniquement par malchance, un programme qui ne plante pas ou se comporte visiblement de façon normale.
Je dis bien par « malchance », car cela rend cette erreur d'autant plus difficile à déceler, et comme tout comportement indéfini, elle attend juste les bonnes conditions pour se manifester.
Je dis bien « apparaît », car en modifiant cette zone vous pouvez très bien modifier de façon totalement imprévisible d'autres variables de votre programme qui occupent dès lors cet emplacement, et inversement.
Exemple de possibilité (qui peut dépendre du compilateur utilisé et/ou des options que vous lui passez) :
Sélectionnez
|
Sélectionnez
|
![]() |
|
Que faire ?
Si la variable en question est un tableau :
- en C++ : n'utilisez pas de tableau C-style ou pointeur, utilisez à la place la classe std::array (cf. Pourquoi dois-je bannir les tableaux C-style et utiliser std::array à la place ?) et (pour des tailles dynamiques) std::vector ainsi que std::string pour des chaînes de caractères ;
- en C : rendez-vous dans le sujet Retourner un tableau depuis une fonction[Erreur courante] Retourner un tableau depuis une fonction.
Dans le cas contraire, vous voudrez probablement effectuer un retour par valeur à la place.