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

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    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 averti 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
    Points : 441
    Points
    441
    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
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    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 éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    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
    Membre averti 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
    Points : 441
    Points
    441
    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
        }
    }

  7. #7
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Membre averti 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
    Points : 441
    Points
    441
    Par défaut
    Et oui, c'est pourquoi je te conseille de toujours mettre des accolades pour le for, if, ... même s'il ne fait qu'une ligne et d'avoir une indentation propre, ça aide bien souvent à trouver les erreurs

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    ok, mais qu'est ce que je doit faire pour que ça fonctionne?

  10. #10
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu réfléchis et tu regarde attentivement le code envoyé par corentin59 un peu plus haut dans la discussion.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Ok merci. J'ai modifié le code et ça fonctionne parfaitement bien.
    Par contre pour libérer la mémoire, toujours le même problème, meme apres modification. voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(j=0; j<NbPal; j++)
    		{
    		free(TabTimePalAlim[j]);
    		free(TabValPalAlim[j]);
    		free(TabTimePalCh[j]);
    		free(TabValPalCh[j]);
    		}
    	free(TabTimePalAlim);
    	free(TabValPalAlim);
    	free(TabTimePalCh);
    	free(TabValPalCh);
    Je ne vois vraiment pas ce qui ne va pas.

  12. #12
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Je ne crois pas qu'il s'agisse d'un problème de libération mémoire. L'erreur est ailleursIl faut examiner le code après la libération des allocations

    "pointer arithmetic involving pointer to freed memory"
    Peut-être, après la libération, un pointeur n'a pas été mis à NULL après libération de la mémoire et du coup tu continues à l'utiliser. (l'arithmétique des pointeurs incluant le déréférencement * et l'indexation [])
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  13. #13
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Oui mais justement, je veux libérer la mémoire afin de ne plus avoir accès à ces données. La fonction "free" me permet de libérer cette mémoire. Je ne comprend donc pas pourquoi je ne peux libérer la mémoire parce qu'elle existe encore. Ou alors j'ai mal compris quelque chose.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Je crois que le problème viens de ma réallocation de mémoire puisque lorsque je supprime cette fonction, mon programme fonctionne très bien. Par contre, je ne vois pas tres bien ou est le problème.

    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;
    						}
    					}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    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;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    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;
    }
    Quelequ'un voit il un problème dans ce code?

    Je vous remercie.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À part que tu ne vérifies pas le retour de realloc_DoublePtr() ou de realloc_Double(), je ne vois pas trop...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Libération de mémoire non réservée (operator=)
    Par 84mickael dans le forum C++
    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