Bases de la programmation en C
int process(int n) {
int *buf = malloc(n * sizeof(int));
if (buf == NULL) return -1;
if (fill(buf, n) != 0)
return -2;
use(buf, n);
free(buf);
return 0;
}fill et use sont des fonctions définies ailleurs. Quel est le problème de la fonction ci-dessus ?
- ALorsque fill renvoie une valeur non nulle, la fonction retourne sans libérer buf, si bien que la zone allouée n'est jamais libérée
- BLa valeur de retour de malloc n'est pas vérifiée, si bien qu'un pointeur NULL est déréférencé en cas d'échec de l'allocation
- Cbuf est utilisé après free, si bien qu'une zone libérée est accédée
Afficher la réponse et l'explication
Réponse : A. Lorsque fill renvoie une valeur non nulle, la fonction retourne sans libérer buf, si bien que la zone allouée n'est jamais libérée
Une zone allouée par malloc subsiste jusqu'à sa libération par free. Sur le chemin où fill échoue et où la fonction sort par return -2, free n'est pas appelé et la valeur (l'adresse) de buf est perdue : cette zone ne pourra plus jamais être libérée. C'est ce qu'on appelle une fuite de mémoire ; si la fonction est appelée de façon répétée, la mémoire utilisable ne cesse de diminuer, ce qui pose surtout problème pour les équipements embarqués et les serveurs qui fonctionnent longtemps. On appelle free(buf) avant de retourner, ou on regroupe la libération en un seul endroit, à la fin de la fonction.
Continuer : 9 autres questions sur Bases de la programmation en C