Hello,
Je sollicite votre aide pour corriger une fuite mémoire dont je n'arrive pas à déterminer l'origine.
Il s'agit peut être d'un faux positif mais ne sachant répondre à mon interrogation tout seul comme un grand, me voici.
J'ai le main suivant :
Lorsque j'appelle cette fonction :
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 int main() { f_log = NULL; if ( ( f_log = log_create_null() ) ) { srand(time(NULL)); i_2D_t* st = NULL; size_t* y = NULL; if ( ( st = i_2D_create_random( 10, &y, 9, 9999, 2) ) ) // Créer un tableau 2D d'entiers positifs ou negatifs (2) et compris entre 0 et 9999 comportant 10 lignes de taille variable ( 0-9 cases ) { i_2D_line_add( st, 9 ); //Supprimer la dernière ligne du tableau 2D i_2D_display( st ); i_2D_detroy( st ); } log_display( f_log ); log_destroy( f_log ); } return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part i_2D_line_add( st, 9 ); //Supprimer la dernière ligne du tableau 2DDr Memory détecte cette erreur (#2), sachant que le nombre d'octets en fuite ( 20 ici ) est variable d'une exécution à l'autre.
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 void i_2D_line_add_( int*** p, size_t* x, size_t x_new, size_t** y ) { int** p_realloc = NULL; if ( ( p_realloc = realloc( (*p), x_new*sizeof( **p ) ) ) ) { *p = p_realloc; for ( size_t i=*x ; i<x_new ; i++ ) (*p)[i] = NULL; size_t* y_realloc = NULL; if ( ( y_realloc = realloc( (*y), x_new*sizeof( **y ) ) ) ) { (*y) = y_realloc; for ( size_t i=*x; i<x_new ; i++ ) (*y)[i] = 0; *x = x_new; } } }
Je suppose donc que c'est cette fonction qui est la cause de cette fuite.Error #1: REACHABLE LEAK 8 direct bytes 0x03360178-0x03360180 + 0 indirect bytes
<memory was allocated before tool took control>
Error #2: LEAK 20 direct bytes 0x03360428-0x0336043c + 0 indirect bytes
# 0 replace_malloc [d:\drmemory_package\common\alloc_replace.c:2577]
# 1 i_allocate [D:/#SORT/Z05_CODE_SOURCE/ptr.c:11]
# 2 i_2D_allocate_random_ [D:/#SORT/Z05_CODE_SOURCE/ptr.c:1089]
# 3 i_2D_create_random [D:/#SORT/Z05_CODE_SOURCE/ptr.c:1171]
# 4 main [D:/#SORT/Z05_CODE_SOURCE/main.c:44]
===========================================================================
FINAL SUMMARY:
DUPLICATE ERROR COUNTS:
SUPPRESSIONS USED:
ERRORS FOUND:
0 unique, 0 total unaddressable access(es)
0 unique, 0 total uninitialized access(es)
0 unique, 0 total invalid heap argument(s)
0 unique, 0 total GDI usage error(s)
0 unique, 0 total handle leak(s)
0 unique, 0 total warning(s)
1 unique, 1 total, 20 byte(s) of leak(s)
0 unique, 0 total, 0 byte(s) of possible leak(s)
1 unique, 1 total, 8 byte(s) of still-reachable allocation(s)
NO ERRORS IGNORED
Si j'ajoute une ligne au tableau 2D plutôt que d'en supprimer une, je n'ai pas cette erreur.
realloc, libère bien la mémoire si la nouvelle taille est inférieure à l'originale ?
Je ne vois que cette possibilité actuellement.
Merci d'avance.
Cordialement.
Partager