IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Libération de mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut Libération de mémoire
    Bonjour,

    J'ai un problème pour désallouer de la mémoire de plusieurs tableau lorsque je termine mon programme. En effet, lorsque je termine mon programme une erreur fatale apparait:

    "pointer arithmetic involving pointer to freed memory"

    Voici comment je libère ma mémoire:

    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
     
     
    	for(j=0; j<NbPal; j++)
    		{
    		free (TabTimePalAlim[j]); // Run time error!!!!
    		TabTimePalAlim[j]=NULL;
    		}
    	free(TabTimePalAlim);
    	TabTimePalAlim=NULL;
     
    	for(j=0;j<NbPal;j++)
    		{
    		free (TabValPalAlim[j]);
    		TabValPalAlim[j]=NULL;
    		}
    	free(TabValPalAlim);
    	TabValPalAlim=NULL;
     
    	for(j=0;j<NbPal;j++)
    		{
    		free (TabTimePalCh[j]);
    		TabTimePalCh[j]=NULL;
    		}
    	free(TabTimePalCh);
    	TabTimePalCh=NULL;
     
    	for(j=0;j<NbPal;j++)
    		{
    		free (TabValPalCh[j]);
    		TabValPalCh[j]=NULL;
    		}
    	free(TabValPalCh);
    	TabValPalCh=NULL;
    Pour allouer la mémoire j'utilise ce code:

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    TabTimePalAlim=(double**) calloc(5,sizeof(double*));
    		for(i=0; i<5; i++)
    			TabTimePalAlim[i]=(double*) calloc(5,sizeof(double));	
     
    		if(TabTimePalAlim==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
     
    			for(i=0; i<5; i++)
    				{
    				free(TabTimePalAlim[i]);
    				TabTimePalAlim[i]=NULL;
    				}
    			free(TabTimePalAlim);
    			TabTimePalAlim=NULL;
    			}
     
    		TabValPalAlim=(double**) calloc(5,sizeof(double*));
    		for(i=0; i<5; i++)
    			TabValPalAlim[i]=(double*) calloc(5,sizeof(double));
     
    		if(TabValPalAlim==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
     
    			for(i=0; i<5; i++)
    				{
    				free(TabValPalAlim[i]);
    				TabValPalAlim[i]=NULL;
    				}
    			free(TabValPalAlim);
    			TabValPalAlim=NULL;
    			}
     
     
    		TabTimePalCh=(double**) calloc(5,sizeof(double*));
    		for(i=0; i<5; i++)
    			TabTimePalCh[i]=(double*) calloc(5,sizeof(double));
     
    		if(TabTimePalCh==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
     
    			for(i=0; i<5; i++)
    				{
    				free(TabTimePalCh[i]);
    				TabTimePalCh[i]=NULL;
    				}
    			free(TabTimePalCh);
    			TabTimePalCh=NULL;
    			}
     
    		TabValPalCh=(double**) calloc(5,sizeof(double*));
    		for(i=0; i<5; i++)
    			TabValPalCh[i]=(double*) calloc(5,sizeof(double));
     
    		if(TabValPalCh==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
     
    			for(i=0; i<5; i++)
    				{
    				free(TabValPalCh[i]);
    				TabValPalCh[i]=NULL;
    				}
    			free(TabValPalCh);
    			TabValPalCh=NULL;
    			}
    je réalloue également la mémoire en cas de besoin:

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    newNbAlim=NbAlim;
    				newNbCharge=NbCharge;
     
    				realloc_DoublePtr(&TabTimePalAlim, newNbAlim);
    				for(i=oldNbAlim ; i<NbAlim ; i++)
    					TabTimePalAlim[i]= NULL;
    				for(i=0 ; i<NbAlim ; i++)
    					realloc_Double(&TabTimePalAlim[i], NbPal);
     
    				realloc_DoublePtr(&TabTimePalCh, newNbCharge);
    				for(i=oldNbCharge ; i<NbCharge ; i++)
    					TabTimePalCh[i]= NULL;
    				for(i=0 ; i<NbCharge ; i++)
    					realloc_Double(&TabTimePalCh[i], NbPal);
     
     
    				realloc_DoublePtr(&TabValPalCh, newNbCharge);
    				for(i=oldNbCharge ; i<NbCharge ; i++)
    					TabValPalCh[i]= NULL;
    				for(i=0 ; i<NbCharge ; i++)
    					realloc_Double(&TabValPalCh[i], NbPal);
     
     
    				realloc_DoublePtr(&TabValPalAlim, newNbCharge);
    				for(i=oldNbCharge ; i<NbCharge ; i++)
    					TabValPalAlim[i]= NULL;
    				for(i=0 ; i<NbCharge ; i++)
    					realloc_Double(&TabValPalAlim[i], NbPal);
     
    				for(i=0;i<NbAlim;i++)
    					{
    					for(j=0;j<NbPal;j++)
    						{
    						TabTimePalAlim[i][j]= 0;
    						}
    					}
     
     
    				for(i=0;i<NbCharge;i++)
    					{
    					for(j=0;j<NbPal;j++)
    						{
    						TabTimePalCh[i][j]= 0;
    						}
    					}
     
     
    				for(i=0;i<NbCharge;i++)
    					{
    					for(j=0;j<NbPal;j++)
    						{
    						TabValPalCh[i][j]= 0;
    						}
    					}
     
     
    				for(i=0;i<NbAlim;i++)
    					{
    					for(j=0;j<NbPal;j++)
    						{
    						TabValPalAlim[i][j]= 0;
    						}
    					}
    Pour l'allocation et la réallocation il n'y a aucun problème.

    Pourriez vous me dire ce qui ne va pas lors de la libération de mes tableaux?

    Je vous remercie.

  2. #2
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    plusieurs choses :
    dans ton code pour libérer la mémoire, tu fais quatre bouclesfusionnes les, c'est toujours ça de pris.

    Ne t'embêtes pas à faire unà chaque fois, sachant que tu vas faire unjuste après.


    Ton code pour l'allocation me parait plus bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TabTimePalAlim=(double**) calloc(5,sizeof(double*));
    for(i=0; i<5; i++)
        TabTimePalAlim[i]=(double*) calloc(5,sizeof(double));
     
    if(TabTimePalAlim==NULL) {
        MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
        for(i=0; i<5; i++) {
            free(TabTimePalAlim[i]);
    	TabTimePalAlim[i]=NULL;
        }
        free(TabTimePalAlim);
        TabTimePalAlim=NULL;
    }
    déjà, ne cast pas la sortie de calloc.

    remplaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calloc(5,sizeof(double*))
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calloc(5,sizeof(*TabTimePalAlim))
    ta vérification de l'allocation est inefficace : tu alloues les TabTimePalAlim[i] avant de vérifier si TabTimePalAlim n'est pas NULL et si c'est le cas, cela ne sert à rien de libérer la mémoire des TabTimePalAlim[i] car elle n'a certainement pas été allouée !!

    Après ce ménage de ton code, dis si tu as toujours un problème !!

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut
    Merci pour ton aide. J'ai modifié comme tu me l'a dit mais ça ne fonctionne toujours pas. J'ai toujours le run time error "pointer arithmetic involving pointer to freed memory".
    Voici les modifications pour l'allocation de mémoire:
    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
    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
     
    TabTimePalAlim=(double**) calloc(5,sizeof(*TabTimePalAlim));
     
    	if(TabTimePalAlim==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
    			free(TabTimePalAlim);
    			TabTimePalAlim=NULL;
    			}
     
    		for(i=0; i<5; i++)
    			TabTimePalAlim[i]=(double*) calloc(5,sizeof(TabTimePalAlim));
     
    		if(TabTimePalAlim[i]==NULL)   //Run time error!!!
    			{ 
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");  
    			for(i=0; i<5; i++)
    				{
    				free(TabTimePalAlim[i]);
    				TabTimePalAlim[i]=NULL;
    				}
    			free(TabTimePalAlim);
    			TabTimePalAlim=NULL;
    			}
     
    		TabValPalAlim=(double**) calloc(5,sizeof(*TabValPalAlim));
     
    		if(TabValPalAlim==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
    			free(TabValPalAlim);
    			TabValPalAlim=NULL;
    			}
     
    		for(i=0; i<5; i++)
    			TabValPalAlim[i]=(double*) calloc(5,sizeof(TabValPalAlim));
     
    		if(TabValPalAlim[i]==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");  
    			for(i=0; i<5; i++)
    				{
    				free(TabValPalAlim[i]);
    				TabValPalAlim[i]=NULL;
    				}
    			free(TabValPalAlim);
    			TabValPalAlim=NULL;
    			}
     
    		TabTimePalCh=(double**) calloc(5,sizeof(*TabTimePalCh));
     
    		if(TabTimePalCh==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
    			free(TabTimePalCh);
    			TabTimePalCh=NULL;
    			}
     
    		for(i=0; i<5; i++)
    			TabTimePalCh[i]=(double*) calloc(5,sizeof(TabTimePalCh));
     
    		if(TabTimePalCh[i]==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");  
    			for(i=0; i<5; i++)
    				{
    				free(TabTimePalCh[i]);
    				TabTimePalCh[i]=NULL;
    				}
    			free(TabTimePalCh);
    			TabTimePalCh=NULL;
    			}
     
    		TabValPalCh=(double**) calloc(5,sizeof(*TabValPalCh));
     
    		if(TabValPalCh==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
    			free(TabValPalCh);
    			TabValPalCh=NULL;
    			}
     
    		for(i=0; i<5; i++)
    			TabValPalCh[i]=(double*) calloc(5,sizeof(TabValPalCh));
     
    		if(TabValPalCh[i]==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");  
    			for(i=0; i<5; i++)
    				{
    				free(TabValPalCh[i]);
    				TabValPalCh[i]=NULL;
    				}
    			free(TabValPalCh);
    			TabValPalCh=NULL;
    			}
    L'allocation ne fonctionne plus. En effet, le programme plante lors du test de l'allocation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabTimePalAlim[i]==NULL
    . Je ne maitrise pas bien le sujet.

    Concernant la libération de mémoire, voici le nouveau code:
    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
     
    for(j=0; j<NbPal; j++)
    		{
    		free(TabTimePalAlim[j]);
    		free(TabValPalAlim[j]);
    		free(TabTimePalCh[j]);
    		free(TabValPalCh[j]);
    		}
    	free(TabTimePalAlim);
    	TabTimePalAlim=NULL;
     
    	free(TabValPalAlim);
    	TabValPalAlim=NULL;
     
    	free(TabTimePalCh);
    	TabTimePalCh=NULL;
     
    	free(TabValPalCh);
    	TabValPalCh=NULL;
    Ici aussi, le programme plante.

    Pourrai tu me dire ce qui ne va pas?

    Merci

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabTimePalAlim[i]=(double*) calloc(5,sizeof(**TabTimePalAlim));
    et pour les autres également.
    Pour le problème de libération, il serait peut-être utile d'avoir le code de realloc_DoublePtr

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut
    ok, je vais essayer ça. Merci.

    Je vous fournis ci dessous le codes des fonctions realloc_DoublePtr et realloc_Double:

    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
     
     
    int realloc_DoublePtr(double ***ppMem, size_t nNew)
    {
    	int ret = -1;
    	double ** pNew = realloc(*ppMem, nNew * sizeof(**ppMem));
    	if(pNew != NULL)
    	{
    		*ppMem = pNew;
    		ret = 0;
    	}
    	return ret;
    }
     
    int realloc_Double(double **ppMem, size_t nNew)
    {
    	int ret = -1;
    	double * pNew = realloc(*ppMem, nNew * sizeof(**ppMem));
    	if(pNew != NULL)
    	{
    		*ppMem = pNew;
    		ret = 0;
    	}
    	return ret;
    }

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		for(i=0; i<5; i++)
    			TabTimePalAlim[i]=(double*) calloc(5,sizeof(**TabTimePalAlim));
     
    		if(TabTimePalAlim[i]==NULL)   //Run time error!!!
    ....
    Ici i ==5, TabTimePalAlim[5] est non alloué (et non initialisé) -> plantage

  7. #7
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Citation Envoyé par totoscill Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TabTimePalAlim=(double**) calloc(5,sizeof(*TabTimePalAlim));
     
    	if(TabTimePalAlim==NULL)
    			{
    			MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
    			free(TabTimePalAlim);
    			TabTimePalAlim=NULL;
    			}
    si TabTimePalAlim est égal à NULL, cela veut dire qu'il y a eut un problème lors de l'allocation mémoire. Mais dans ce cas, ça ne sert à rien de faire un free(), de mettre le pointeur à NULL (il l'est déjà) mais surtout, il ne suffit pas de faire un message qui dit qu'il y a eut un problème, il faut arrêter l'exécution du programme, or toi tu le continue.

    Voici ce que je te propose pour l'allocation :
    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
    TabTimePalAlim = calloc(5,sizeof(*TabTimePalAlim));
    if ( TabTimePalAlim == NULL ) {
        // on affiche un message
        // on sort du programme en renvoyant un code d'erreur
    }
    for(i=0;i<5;i++) {
        TabTimePalAlim[i] = calloc(5,sizeof(*TabTimePalAlim[i]));
        if ( TabTimePalAlim[i] == NULL ) {
            // on affiche un message
            for(j=0;j<i;j++) {
                free(TabTimePalAlim[j]);
            }
            free(TabTimePalAlim);
            // on sort du programme en renvoyant un code d'erreur
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/05/2006, 13h30
  2. Problème libération de mémoire?
    Par Bartuk dans le forum C
    Réponses: 7
    Dernier message: 28/12/2005, 17h20
  3. Libération de mémoire
    Par petitcoucou31 dans le forum Langage
    Réponses: 1
    Dernier message: 16/09/2005, 14h10
  4. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38
  5. Réponses: 25
    Dernier message: 16/07/2003, 20h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo