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 :

besoin de comprehension sur free() et pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut besoin de comprehension sur free() et pointeur
    Bonjour,
    Je développe depuis peu en C et je commence tout juste à assimiler les concepts de pointeurs et gestion mémoire. Jusqu'à maintenant je n'ai pas vraiment eu de problemes avec la gestion dynamique de la mémoire. Mais là si. Je n'arrive pas à libérer de la mémoire suite à une structure de données un peu spéciale et qui doit sans doute être fausse. J'aimerai bien une petite explication clair du bug.
    Voici le code. A la fin il y a 2 tests de print et j'obtiens une valeur pour test.toto[33].toto1 alors que je pensais avoir libéré la mémoire. Merci de votre aide:

    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
    	struct TOTO
    	{
    		int toto1;	
    	};
     
    	struct TEST
    	{
    		int test1;
    		float test2;
    		float test3[2];
    		struct TOTO *toto;	
    	};
     
    	struct TEST test;
     
    	if((test.toto = (struct TOTO*)malloc(50*sizeof(struct TOTO))) == NULL)
    	{
    		printf("erreur");
    	}
     
    	test.test1 = 1234;
    	int i;
    	for(i=0;i<50;i++)
    	{
    		test.toto[i].toto1 = i;	
    	}
     
     
    	printf("%d\n",test.test1);
    	printf("%d\n",test.toto[33].toto1);
            //je libere la memoire de *toto, enfin je croyais
    	free(test.toto);
    	printf("%d\n",test.toto[33].toto1);
     
    	return EXIT_SUCCESS;	
    }

  2. #2
    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
    Oh! la mémoire a été libérée mais pas réutilisée pour stocker quelque chose et il reste dedans les anciennes valeurs

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut
    Mais alors est ce que ce code est juste.......
    Et pourquoi ai je acces aux valeurs alors que je pensai perdre l'adressage mémoire ?
    Merci déjà de ta première réponse.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 816
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par leprofmelo Voir le message
    Mais alors est ce que ce code est juste.......
    Non puisque tu demandes une information qui ne t'appartient plus depuis le free(). Le comportement est indéterminé (personne ne peut prévoir ce qui va se passer => tu peux aussi bien récupérer les anciennes valeurs que faire planter ton programme)
    Citation Envoyé par leprofmelo Voir le message
    Et pourquoi ai je acces aux valeurs alors que je pensai perdre l'adressage mémoire ?
    Ben pourquoi le C devrait réinitialiser inutilement cette zone et avec quelle valeur ? La zone est libre donc le prochain qui la récupère pourra y écrire ce qui lui semble important mais tant que personne n'a rien écrit la zone garde les dernières valeurs stockées...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut
    Merci de ta réponse sve@r, mais alors autre question ? Est ce que la mémoire reste occupée pour le system d'exploitation au point d'avoir l'impression qu'il y a une fuite mémoire ?

  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
    Citation Envoyé par leprofmelo Voir le message
    Merci de ta réponse sve@r, mais alors autre question ? Est ce que la mémoire reste occupée pour le system d'exploitation au point d'avoir l'impression qu'il y a une fuite mémoire ?
    Non

  7. #7
    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
    Une adresse reste une adresse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            //je libere la memoire de *toto, enfin je croyais
    	free(test.toto);
    	printf("%d\n",test.toto[33].toto1);
    Ce qui est sûr, c'est que ce printf est incorrect et que tu as la MALCHANCE qu'il ne te donne pas une valeur incohérente et que ton programme ne plante pas sur le champ : Tu accèdes à des zones mémoires qui ne t'appartiennent plus et le résultat est imprévisible.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par leprofmelo Voir le message
    Je développe depuis peu en C et je commence tout juste à assimiler les concepts de pointeurs et gestion mémoire. Jusqu'à maintenant je n'ai pas vraiment eu de problemes avec la gestion dynamique de la mémoire. Mais là si. Je n'arrive pas à libérer de la mémoire suite à une structure de données un peu spéciale et qui doit sans doute être fausse. J'aimerai bien une petite explication clair du bug.
    Quelques remarques.
    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
     
    /* -ed- j'ai une macro globale qui s'appelle TEST et qui vaut 1... */
    #undef TEST
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
    	struct TOTO
    	{
    		int toto1;
    	};
     
    	struct TEST
    	{
    		int test1;
    		float test2;
    		float test3[2];
    		struct TOTO *toto;
    	};
     
    	struct TEST test;
     
    	if((test.toto = (struct TOTO*)malloc(50*sizeof(struct TOTO))) == NULL)
    	{
    		printf("erreur");
    	}
     
    	test.test1 = 1234;
    	int i;
    	for(i=0;i<50;i++)
    	{
    		test.toto[i].toto1 = i;
    	}
     
     
    	printf("%d\n",test.test1);
    	printf("%d\n",test.toto[33].toto1);
            //je libere la memoire de *toto, enfin je croyais
     
       /* -ed- je conseille de metre en oeuvre tout de suite les
               'Bonnes Pratiques'. Remettre le pointeur à NULL apres usage. */
    	free(test.toto), test.toto = NULL;
     
    	/* -ed- comportement indetermine... */
    	printf("%d\n",test.toto[33].toto1);
     
    	return EXIT_SUCCESS;
    }
    A partir du moment où tu as appelé free() avec la valeur retournée par malloc(), le bloc pointé est libéré. Ta manip ne prouve rien, car elle invoque un comportement indéterminé (accès à un bloc libéré).

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

Discussions similaires

  1. POO - Operation de pointeur incorrect sur Free
    Par Diablo64 dans le forum Langage
    Réponses: 9
    Dernier message: 17/03/2009, 13h46
  2. Besoin d'aide sur les pointeurs
    Par amateurc dans le forum Ada
    Réponses: 5
    Dernier message: 03/06/2008, 14h58
  3. besoin d aide sur un exercice sur les pointeurs
    Par azumachakib69 dans le forum C
    Réponses: 3
    Dernier message: 28/12/2006, 01h16
  4. [debutant] prob de comprehension sur pointeur **
    Par iznogoud36 dans le forum C
    Réponses: 10
    Dernier message: 14/09/2006, 13h13
  5. Besoin d'aide sur pointeur
    Par SebRs dans le forum C++
    Réponses: 2
    Dernier message: 18/05/2006, 10h21

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