C'est juste pour que tout le monde le sache. ;-)
J'ai rarement utilisé un outil aussi bien conçu. Clair, pratique, léger... tout ça! Malgré la masse, je veux l'avalanche d'options, tout va bien parce les valeurs standard font juste ce qu'on veut dans le cas courant.
Enfin, je n'ai pour l'instant utilisé que l'outil memcheck. C'est outil m'a fait comprendre et prendre conscience de ce à quoi il faut faire attention dans la gestion de mémoire. C'est bien mieux que ce que j'attendais. Et à l'occasion de cette chasse aux fuites, j'ai aussi trouvé un vrai bug logique ; que j'aurais eu du mal à diagnostiquer d'ailleurs, même si j'avais la chance qu'il se manifeste clairement.
J'espère que les outils de profiling sont aussi bien foutus.
A part ça, 3 petites questions relatives à la mémoire:
1. Comment libérer une valeur de retour directement utilisée; typiquement une chaîne. Exemple.
Bon, vous avez ma solution actuelle en version 2. Je ne pige pas bien pourquoi comment je me trouve obligé d'écrire un code si lourdingue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 char * chaine (size_t count, Data data) { char * s = malloc (count * sizeof(char)) ; // .........mets des choses dedans............ return s ; } // version 1 void affiche_chaine () { // .........prépare les donées............ // affiche les données // *** fuite de mémoire *** printf ("voilà : %s", chaine (size_t count, Data data) ; } // version 2 void affiche_chaine () { // .........prépare les donées............ // affiche les données // *** fuite de légèreté *** char * s = chaine (size_t count, Data data) ; printf ("voilà : %s", s) ; free (s) ; }
EDIT: En fait, le point clé, c'est qu'il faut nécessairement nommer ce qu'on veut/doit libérer, non?
2. Si j'écris une func qui retourne une chaîne, comme ci-dessus, mais en l'allouant sur le pile (explicitement ou non), la fonction appelante la reçoit quand même! (alors que bien sûr je ne passe en retour en fait qu'un pointeur). Comment ça se fait?
Ca voudrait dire qu'il y a une copie implicite de la zone pointée par la valeur de retour (comme si c'était cette zone la vlaeur de retour), ou alors que le compilo ne libère pas cette zone, "sachant" qu'elle est utilisée ailleurs. ??? J'ai jamais entendu parler d'un truc comme (en C). Par exemple un truc comme ça marche:
Y a un fantôme dans mon compilo? Qu'est-ce que je n'ai pas pigé?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 char * str () { return (char *) "xyz" ;} int main (void) { puts (str()) ; return 0 ;}
J'ai oublié quel était mon problème n° 3 !
Denis
Partager