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 :

"void*","char*" et fuite mémoire.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Chômeur inutile
    Inscrit en
    Juillet 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chômeur inutile
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 96
    Par défaut "void*","char*" et fuite mémoire.
    Bonjour tout le monde.

    j'utilise Visual c++ 2008.
    Je m'attaque sérieusement au pointeur et j'aurais aimé savoir si ce petit programme (qui fonctionne) ne crée pas de problème (fuite mémoire et autre):

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>[/B]
     
    int main(int argc, char *argv[])
    {	
    	void* vp;
    	char* cp;
    	vp=(void*)malloc(sizeof(char*));
    	vp="a333";
    	printf("%s\n",vp);
    	vp="a22";
    	cp=(char*)vp;
    	vp=NULL;
    	free(vp);
    	printf("%s\n",cp);
    	cp="a1";
    	printf("%s\n",cp);
    	system("PAUSE");	
    	return 0;
    }

  2. #2
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Oui, il y a une fuite mémoire !

    Tu alloues de la mémoire et tu mets l'adresse de cette zone mémoire dans le pointeur vp. Là c'est bon !
    Ensuite tu fait pointer ce pointeur sur une chaîne de caractère. Donc à ce moment là, tu perds l'adresse de la zone mémoire que tu y avais mis auparavant !
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    A première vue je dirais que si , même si je suis loin d'être un grand spécialiste du domaine

    Pourquoi ne pas mettre char* ? Même si c'est correct je pense qu'il vaut mieux éviter des variables de type void* sauf dans des cas particuliers. Après je conçois tout à fait que tu souhaites t'entraîner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vp=(void*)malloc(sizeof(char*));
    vp="a333";
    Tu déclares allouer la taille d'un pointeur de char, c'est à dire sur beaucoup de machines 4 octets. Cependant cela ne sert à rien puisque tu déclares ensuiteDonc il y a fuite de mémoire puisque tu ne libères pas ce que tu as alloué avant d'écrire vp="a333";

    Il faut donc ici écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vp=(void*)malloc(X*sizeof(char));
    Avec X le nombre de caractères que tu souhaites mettre dans ta chaîne (ici 4 donc) et faire ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    *vp = 'a';
    *(vp+1) = '3';
    *(vp+2) = '3';
    *(vp+3) = '3';
    Ou sinon tu déclares directement :
    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vp=NULL;
    free(vp);
    Mettre à nul le pointeur ne sert à rien si tu libères ce pointeur après donc ici le est totalement inutile. D'ailleurs si tu l'avais mis avant la mise à 0 du pointeur tu aurais eu une fuite de mémoire, car, lorsque tu déclares cela signifie que le pointeur cp va prendre la valeur du pointeur vp, donc si tu libères vp à cet instant, cp ne va pointer sur plus rien.
    Donc "Heureusement" encore une fois que tu ais mis le pointeur vp à NULL avant de le libérer, sinon tu aurais eu une fuite

    Enfin, tu as une dernière fuite de mémoire puisque tu n'appelle pas free() pour libérer le pointeur cp, anciennement vp, mais comme tu as mis vp à NULL tu dois libérer cp, sinon tu aurais eu le choix entre libérer l'un ou libérer l'autre mais pas les 2 ! Si tu as besoin d'autres explications n'hésite pas !

    Edit : CGi dit plus ou moins la même chose en omettant toutefois la dernière fuite de mémoire (ou alors c'est moi qui me trompe )

    Edit bis : je dirais que ce code est correct :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char *argv[])
    {
    void* vp;
    char* cp;
    vp=(void*)malloc(sizeof(char)*//ce que tu veux//); //ligne ici totalement inutile
    free(vp); //inutile si ligne précédente absente
    vp="a333";
    printf("%s\n",vp);
    vp="a22";
    cp=(char*)vp;
    printf("%s\n",cp);
    free(cp); // ou free(vp) puis vp=NULL;
    cp="a1";
    printf("%s\n",cp);
    //plus besoin de libérer cp ni de le mettre à NULL
    system("PAUSE");	
    return 0;
    }

  4. #4
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Voir commentaires dans 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
     
    #include <stdio.h>
    #include <stdlib.h>
    //#include <string.h> // Pas utile ici
    int main(void)
    {
        void* vp;
        char* cp;
        vp = (void*)malloc(sizeof(char*)); // Transtypage pas necessaire et taille pas bonne.
        vp = "a333"; // ICI tu perds l'adresse de ton bloc mémoire
        printf("%s\n",(char*)vp); //Là tu peux mettre un transtypage
                                    // pour éviter le warning
        vp="a22";
        cp=(char*)vp;
        vp=NULL;  // On met le pointeur à null
        free(vp); // après avoir libéré la mémoire.
        printf("%s\n",cp);
        cp="a1";
        printf("%s\n",cp);
        system("PAUSE"); // "Pause" spécifique à Windows
        return 0;
    }
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

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

Discussions similaires

  1. UPDATE en ajoutant un 0 sur un champ de type "char"
    Par doum2 dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/03/2006, 14h22

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