Bonjour,
Je poursuis mon apprentissage de la Glib, du GTK+ conjointement à ma redécouverte du C après abandon de plusieurs années.
N'êtant pas encore très sûr de moi dans ma gestion de la mémoire, je cherche un moyen sûr et imparable si possible de faire les vérifications nécessaires.
J'étudie 3 pistes différentes:
* wrapper malloc, g_malloc, free, g_free, ... à coup de directives préprocesseur.
* valgrind qui semble profondément troublé par Glib et GTK
* utilisation de g_mem_profile (avec at_exit)
------------------------------------
Voici le code d'un programme bidon (une gtk_window, une gtk_hbox et 2 boutons) pour illustrer:
------------------------------------Code:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
MES QUESTIONS:
1/ des remarques et commentaires éventuels sur mon code C (c'est toujours utile) ?
2/ Méthode avec valgrind
Valgrind me sort des fuites-mémoiresCode:
2
3
4
5
6
7
8
9
10
11
12
13
a/ je ne peux pas différencier les allocations/désallocations imputables à la g_lib des miennes propres. Donc valgrind inutilisable ? Comment faites-vous ?
b/ Que représentent les "still reachable" (d'une façon générale hors du contexte glib/gtk) ? Est-ce que ça peut induire un souci de sécurité ?
3/ Méthode avec g_mem_profile
a/ utilisation correcte ?Code:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Je ne suis pas sûr d'avoir bien compris la doc même si ça semble fonctionner.
b/ interprétation:
Là aussi, tout n'est pourtant pas libéré par le GTK ? freed=551680 (69,85%), remaining=238149
(Et les chiffres sont totalement différents de valgrind, ce qui n'est pas forcément étonnant)
4/ Méthode avec wrapping malloc
La méthode est plutôt sympa même si je ne l'ai pas implémentée jusqu'au bout (notamment les realloc).
L'inconvénient majeur est que certaines fonctions de la g_lib comme g_strdup par exemple exigent un free explicite sans malloc préalable ce qui fausse mes résultats. (trop de free et pas assez de malloc)
Mais au moins je pense que je peux checker assez bien quand même mes propres allocations et désallocations par ce biais. Des commentaires ?

