Bonjour à tous,

J'ai un gros problème mémoire que je n'arrive pas expliquer (depuis 10 heures intenses en recherches et tests). J'ai réduit mon code au minimum pour que vous puissiez m'aider je l'espère.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
typedef struct e{
    int i;
    struct e *svt;
} element;
 
typedef element *liste;
Il s'agit ici d'une simple liste chainée.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
void init(liste *P){
	*P=NULL;
}
Initialisation toute bête...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
void supp(liste *P){
    element* tmp=*P;
    *P=tmp->svt;
    free(tmp);
}
On supprime ici l’élément en tête de liste. On retiens donc cet élément pour pouvoir le supprimer proprement avec free et le second élément devient le premier de la liste.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
element* ajout(liste *P,int i){
    element* nouveau=malloc(sizeof(element));
    nouveau->i=i;
    nouveau->svt=NULL;
    if(*P==NULL) // La liste est vide...
        *P=nouveau;
    else{
        nouveau->svt=*P;
        *P=nouveau;
    }
    return nouveau;
}
On ajoute un élément à la liste...

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
 
int main()
{
    const int tours=1000000;
    int i=0;
	liste Maliste;
	init(&Maliste);
 
    printf("Observation 1: Observez la memoire utilisee avant de commencer\n");
    Sleep(5000);
 
    for(i=0;i<=tours;i++){
        ajout(&Maliste,i);
        supp(&Maliste);
    }
 
    printf("Observation 2: La memoire devrait toujours etre identique\n");
    Sleep(5000);
 
    for(i=0;i<=tours;i++)ajout(&Maliste,i);
    for(i=0;i<=tours;i++)supp(&Maliste);
 
    printf("Observation 3: Fuite memoire observable\n");
    Sleep(5000);
	return EXIT_SUCCESS;
}
Et voila notre main révélateur. La première observation retourne la même quantité de mémoire utilisée que la seconde (chez moi 332K).

La troisième observation par contre est révélatrice d'une fuite mémoire, puisque pour la même opération on obtiens cette fois 948K de mémoire utilisée.

Fichier source complet: main.c

Merci beaucoup pour votre aide.