Bases de la programmation en C
En C, quelle est la raison la plus appropriée pour laquelle il est recommandé d'écrire p = NULL; juste après free(p); ?
- ASans l'affectation de NULL, la zone libérée ne redevient pas disponible, ce qui provoque une fuite de mémoire
- Bp continue de désigner la zone libérée : cela évite les doubles libérations et les utilisations après libération, et les rend plus faciles à détecter
- Cfree met automatiquement p à NULL, mais on réécrit la même valeur par précaution, pour vérifier
Afficher la réponse et l'explication
Réponse : B. p continue de désigner la zone libérée : cela évite les doubles libérations et les utilisations après libération, et les rend plus faciles à détecter
free(p) libère la zone que désignait p, mais la valeur (l'adresse) de la variable p reste inchangée. Lire ou écrire *p ensuite est une utilisation après libération (use after free), et rappeler free(p) est une double libération (double free) ; les deux sont des comportements indéfinis, qui peuvent corrompre les informations de gestion du tas et faire apparaître une anomalie loin de la cause. Si p reçoit NULL, la double libération est sans danger, puisque free(NULL) est défini comme ne faisant rien, et une vérification de NULL avant usage révèle aussi l'erreur. Les autres pointeurs qui désignent la même zone demandent toutefois une attention séparée.
Continuer : 9 autres questions sur Bases de la programmation en C