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 :

Une erreur sur le free.. Oui mais pourquoi ?


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut Une erreur sur le free.. Oui mais pourquoi ?
    Bonjour,
    voià je desire supprimer d'une chaine de caractere les n premiers caracteres (par exemple les n premiers espaces)
    Exemple:
    "_______bonjour_" devient "bonjour_"
    (_: pour la représentation d'un espace)

    donc je ne vais pas y aller par 4 chemins voic mon programme:
    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
     
    #include "stdafx.h"
    #include <conio.h>
     
    void supprFisrt(char* buf, int buflen, char c) 
    { 
        char * tmp = (char*)malloc(sizeof(char)*buflen);
        int current = 0;
        memcpy(tmp, buf, buflen);
        while ((*tmp) && (current < buflen) && (*tmp == c) )
       {         
          tmp++; 
          current++;
       }
     
    memset(buf, '\0', 1);
    memcpy(buf, tmp, buflen);	
    buf[buflen-current] = 0; 	
    printf("adr buf = %p\n", &buf);
    printf("adr tmp = %p\n", &tmp);
     
    //free(tmp); //ERREUR ICI !!??
    return; 
    }
     
    int main()
    {
      char *data = (char*)malloc(1000);
      memcpy(data, "  information\0", 14);
      printf("data = [%s]\n", data);
      printf("adr data= %p\n", &data);
     
     supprFisrt(data, 14, ' ');
     printf("data = [%s]\n", data);
     free(data);
     getch();
     return 0;
    }
    Voila. Je ne vois pas du tout pourquoi le free plante !!


    J'ai aussi une autre question.
    Admettons cette fonction toute simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char* affich()
    {
    char *out= (char*)malloc(10);
    mempcy(out, "tomate\0",7);
    return out;
    }
    Jusque la ok pas de problème... et maintenant si dans le main je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%s\n", affich()); //j'appelle ma fonction qui retourne un char*
    Quand est ce que out est désalloué ???


    Merci pour m'avoir lu et merci encore de me répondre...
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //free(tmp); //ERREUR ICI !!??
    Normal, tu as modifié l'adresse pointée par tmp dans ta boucle, c'est logique qu'après free s'affole...

    Il faudrait stocker le retour du malloc et après faire ton code... A la fin, désalloue le pointeur copié...

    Quand est ce que out est désalloué ???
    Jamais, la mémoire sera retourné au SE à la fin de l'exécution...

    Jc

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Jamais, la mémoire sera retourné au SE à la fin de l'exécution...
    Alors c'est une très très mauvaise méthode !!!!

    Quand à l'autre méthode, je vais essayer ce que tu me dis de suite.

    Merci
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Et oui quel idiot !!

    La correction est donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *tmps = tmp; //On sauvegarde le pointeur
    ...
    ...
    free(tmps); //au lieu de free(tmp);
    Parfait !
    Merci encore.
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    Alors c'est une très très mauvaise méthode !!!!
    Qu'en penses tu ?
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

  6. #6
    Membre habitué Avatar de Marco85
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 210
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par MonsieurAk
    Alors c'est une très très mauvaise méthode !!!!
    Qu'en penses tu ?
    Salut MonsieurAk !!!

    Bien sûr qu'il s'agit d'une très très mauvaise méthode ... Il s'agit d'une fuite mémoire !!! A supprimer d'urgence ...

    Marco85
    If you cannot explain a concept to a six year-old, then you do not fully understand it. [Albert Einstein]

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Qu'en penses tu ?
    Il faut l'éviter en effet.

    Jc

    PS: Penses à mettre ce sujet en résolu

  8. #8
    Membre régulier
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Points : 91
    Points
    91
    Par défaut
    c'est fait !
    (j'attendais juste quelques commentaires...)

    Merci !
    L'echec ne doit pas être considéré comme une perte de temps mais comme l'apprentissage.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/11/2013, 21h39
  2. capturer une erreur sur un import
    Par cysboy dans le forum Langage
    Réponses: 2
    Dernier message: 09/10/2007, 12h17
  3. Des fibres ? Oui, mais pourquoi faire ?
    Par mchk0123 dans le forum Windows
    Réponses: 2
    Dernier message: 01/05/2007, 21h05
  4. [D7] erreur sur Form.Free
    Par jlf dans le forum Delphi
    Réponses: 9
    Dernier message: 01/05/2007, 12h52
  5. Réponses: 2
    Dernier message: 09/10/2006, 10h06

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