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 :

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;
}
Lorsque j'appelle cette fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
i_2D_line_add( st, 9 ); //Supprimer la dernière ligne du tableau 2D
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;
        }
    }
}
Dr Memory détecte cette erreur (#2), sachant que le nombre d'octets en fuite ( 20 ici ) est variable d'une exécution à l'autre.
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
Je suppose donc que c'est cette fonction qui est la cause de cette fuite.
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.