Bonjour,
Dans un projet, je dois manipuler des matrices dans F_2 (c'est-a-dire il n'y a que des zeros ou des 1). Je créer ma structure de la facon suivante :
ou nb_row est le nombre de ligne, nb_col le nombre de colonne, tab ma matrice a proprement parlé, et nb_uc le nombre de unsigned char. car je n'utilise pas un octet pour stocker un bit un octet stok huit bits.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 typedef struct matrix{ unsigned char nb_row; unsigned char nb_col; unsigned char nb_uc; unsigned char **tab; } matrix;
C'est a dire une matrice 8x8 va contenir 8 unsigned char.
Maintenant je creer un createur et un destructeur de ma structure
et quand je passe a valgrind ce simple executable :
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 matrix *create(unsigned char row, unsigned char column) { unsigned char i, j, nb_uc; matrix *retour; nb_uc = (unsigned char) ceil((float)row/8); assert((retour = malloc(sizeof(matrix))) != NULL); assert((retour->tab = malloc(sizeof(unsigned char*)*nb_uc)) != NULL); for(i=0; i<nb_uc; i++) { assert(((retour->tab)[i] = malloc(sizeof(unsigned char)*column)) != NULL); for(j=0; j<column; j++) { (retour->tab)[i][j] = 0; } } retour->nb_row = row; retour->nb_col = column; retour->nb_uc = nb_uc; return(retour); } void destroy(matrix **A) { unsigned char i; for(i=0; i<(*A)->nb_uc; i++) { free(((*A)->tab)[i]); ((*A)->tab)[i] = NULL; } free((*A)->tab); (*A)->tab = NULL; free(*A); (*A) = NULL; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int main(void) { matrix *A; A = create(4,4); destroy(&A); return(0); }
il me sort
Si j'ai bien compris il dit qu'il n'y a pas de fuite mémoire mais pourtant il dénombre 4 allocations mais seulement 3 free...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ==5221== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 1) ==5221== malloc/free: in use at exit: 10,448 bytes in 1 blocks. ==5221== malloc/free: 4 allocs, 3 frees, 10,464 bytes allocated. ==5221== For counts of detected errors, rerun with: -v ==5221== searching for pointers to 1 not-freed blocks. ==5221== checked 78,172 bytes.
Ce qui est bizar car si je fait le source a la main je ne compte pour creer une matrice 4x4 que 3 malloc(), d'ou sort ce quatrieme....
Qu'en pensez vous??
(Je veux bien admettre que je n'ai pas été clair, alors hesitez pas a me signaler si ca ne l'est pas!!)
Merci d'avance.
Partager