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 :

Problème libération de mémoire?


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 91
    Points : 66
    Points
    66
    Par défaut Problème libération de mémoire?
    Bonjour,

    voilà je ne suis pas très bon en C et j'ai un problème avec une DLL que j'ai rédigée. En effet, j'appelle plusieurs fois ma fonction de dll depuis une appli exterieure, et au bout de 37-38 appels, l'application exterieure plante. Je pensais donc à un problème de libération de mémoire... 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
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
     
    char * appliAC (char * request_path, char * request_host, char * user, char * password, char * chemin, char * titre, char * auteur, char * description, int pub, int conf, char * dest) {
    char buffer[PACKET_SIZE+1];
    char line[PACKET_SIZE+2];
    char param[PACKET_SIZE];
    char body[PACKET_SIZE];
    char * fic;
     
    long taillefic=0;
    int rc;
    int i = 0;
    int isEntete = 1;
    char *finEntete;
    FILE upload;
     
    char * Reponse=(char *)calloc(10, sizeof(char));
     
            sprintf(buffer,"Vide\n");
     
    		//recuperation des donnees
                    if ( ( upload = fopen(chemin,"rb")) == NULL ) {
    	         Reponse="03";
                   }
    	else{
    	//calcul de la taille du fichier
    	fseek(upload, 0, SEEK_END);
    	taillefic=ftell(upload);
    	printf("Longueur du fichier %s: %lu\n", chemin, taillefic);
    	fclose(upload);
    	fic=(char *)calloc(taillefic, sizeof(char));
    	upload = fopen(chemin,"rb");
    	fread(fic, sizeof(char), taillefic, upload);
    	fclose(upload);
     
    	//contruction du corps de la requete
    	sprintf(param, "-----6G+f\r\n"
    	"Content-Disposition: form-data;name=\"cPseudo\"\r\n"
    	"\r\n"
    	"%s\r\n"
    	"-----6G+f\r\n"
    	"Content-Disposition: form-data;name=\"cMotDePasse\"\r\n"
    	"\r\n"
    	"%s\r\n"
    	"-----6G+f\r\n"
    	"Content-Disposition: form-data;name=\"cTitre\"\r\n"
    	"\r\n"
    	"%s\r\n"
    	"-----6G+f\r\n"
    	"Content-Disposition: form-data;name=\"cAuteur\"\r\n"
    	"\r\n"
    	"%s\r\n"
    	"-----6G+f\r\n"
    	"Content-Disposition: form-data;name=\"cDescription\"\r\n"
    	"\r\n"
    	"%s\r\n"
    	"-----6G+f\r\n"
    	"Content-Disposition: form-data;name=\"cPublic\"\r\n"
    	"\r\n"
    	"%d\r\n"
    	"-----6G+f\r\n"
    	"Content-Disposition: form-data;name=\"cConfidentiel\"\r\n"
    	"\r\n"
    	"%d\r\n"
    	"-----6G+f\r\n"
    	"Content-Disposition: form-data;name=\"cDestinataire\"\r\n"
    	"\r\n"
    	"%s\r\n"
    	"-----6G+f\r\n"
    	"Content-Disposition: form-data; name=\"CheminDoc\"; filename=\"%s\"\r\n"
    	"Content-type:application/octet-stream\r\n"
    	"Content-length:%d\r\n"
    	"\r\n"
    	, user, password, titre, auteur, description, pub, conf, dest, chemin, taillefic);
     
    	sprintf(body, "\r\n"
    	"-----6G+f--\r\n");
     
    	//construction de la requete
    	sprintf(line,
    	"POST %s "
    	"HTTP/1.1\r\n"
    	"Host: %s\r\n"
    	"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n"
     
    	"Accept-Encoding: gzip, deflate\r\n"
    	"Content-Type: multipart/form-data; boundary=---6G+f\r\n"
    	"Content-length:%d\r\n\r\n"
    	,request_path, request_host, taillefic+strlen(param)+15);
     
     
     
    	//envoi de la requete par morceaux
    	printf ("%s", line);
    	send(to_server_socket,line,strlen(line),0);//entete
    	printf ("%s", param);
    	send(to_server_socket,param,strlen(param),0);//corps
    	send(to_server_socket, fic, taillefic, 0);
    	printf ("%s", body);
    	send(to_server_socket,body,strlen(body)+1,0);
    	free(fic);
     
    	do {
     
    	rc = readn(to_server_socket,buffer,PACKET_SIZE);
    							if ( isEntete == 1 ) {
    							finEntete = (char *)strstr(buffer,"\r\n\r\n");
    							if ( finEntete != NULL ) {
    							*finEntete = 0x00;
    	strncpy(Reponse, finEntete+4, rc-strlen(buffer)-4);
    	isEntete = 0;
    							}
    							else{
    							strncat(Reponse, buffer, rc);
    							}
     
    	}
    	else{
     
    		strncat(Reponse, buffer, rc);
    	}
    		} while (rc==PACKET_SIZE);
    		}
    		return Reponse;
    }

    Je n'arrive pas à débugguer ce truc et c'est vraiment important, donc si quelqu'un pouvait m'aider ca serait formidable...
    Merci d'avance à tous
    Il faut être économe de son mépris en raison du grand nombre de nécessiteux (Chateaubriand)

  2. #2
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut
    tu ne gére pas la libération de finEntete. sinon je vois rien d'autre.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 91
    Points : 66
    Points
    66
    Par défaut
    Je viens d'essayer et ca a encore planté à 38 appels... Ce dont tu me parlais c'etait de faire un free(finEntete); non?

    comme ca?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
     
    } while (rc==PACKET_SIZE);		
    free(finEntete);
    	}
    	return Reponse;
    }
    Merci
    Il faut être économe de son mépris en raison du grand nombre de nécessiteux (Chateaubriand)

  4. #4
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut
    pas là ou tu l'as mis !
    essaye plutôt d'initialiser a NULL et en fin du DO tu free() si ton pointeut est différent de NULL (en le remettant à NULL après le free)
    Mais ce n'est pas forcement la solution à tes plantages

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 91
    Points : 66
    Points
    66
    Par défaut
    Ok merci j'ai fait la modif... par contre tu as raison, cela ne résoud pas mes problèmes malheureusement...

    Si vous avez besoin de plus de descriptions dites le moi je vous fournirai le reste...

    Merci
    Il faut être économe de son mépris en raison du grand nombre de nécessiteux (Chateaubriand)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 91
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Je n'abandonne pas!

    Je viens de m'apercevoir de quelque chose qui j'en suis sur va en fair rire plus d'un...

    J'ai ceci :

    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
     
    char * __stdcall SendDoc (char * request_host, char * port, char * user, char * password, char * dest,  char * titre, char * chemin, char * description, char * auteur, int pub, int conf)
    {
     
    	int to_server_socket=connection(request_host, atoi(port));
    	char * Reponse=(char *)calloc(10, sizeof(char));
    	int Cpt=0;
    	if (to_server_socket!=0){
    	char * temp=appliAC("MaServlet", request_host, user, password, chemin, titre, auteur, description, pub, conf, dest);
    	sprintf(Reponse, "%s", temp);
                    closeconnect(to_server_socket);
    	}
    	else
    		sprintf(Reponse, "%s", "00");
     
    	return Reponse;
    }

    C'est la méthode qui appelle la méthode que j'ai présenté précédemment.
    Cette méthode retourne "Reponse" à une appli VB (dont je n'ai pas le code )

    Si je termine ma fonction comme ceci, je n'ai plus de problème semblerait il :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    free(Reponse);
      Reponse=NULL;
      return Reponse;
     
    }
    Alors bien sur le problème c'est qu'il ne me renvoie plus rien mais est ce que ca voudrait dire que la mémoire de "Reponse" n'est pas bien libérée? Si oui, ou et comment dois je le faire?

    Merci d'avance
    Il faut être économe de son mépris en raison du grand nombre de nécessiteux (Chateaubriand)

  7. #7
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut
    bah là en l'occurence si l'application qui fait l'appel ne libére pas reponse, tu es mal.

    Soit tu essaye de retourner un tableau a taille fixe. Soit tu fait un mécanisme de libération de mémoire.

    Par exemple dans ta Dll tu crée une fonction qui gére l'ensemble des pointeurs reponse cree et a chaque appel de tes autres fonctions tu libere les zones alloués avant.
    Tout le problème est de savoir si entre deux appel de ta Dll le programe precedent utilise toujours ou non la zone memoire que tu avais alloué.
    Tu peux alors mettre un compteur pour différer le free de n appel. Ou te référé à l'heure pour faire l'équivalent d'un time out.

    Je suis pas trop au fait de ce type de Dll mais tu dois pouvoir trouver un moyen de liberé la mémoire d'une façon ou d'une autre.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 91
    Points : 66
    Points
    66
    Par défaut
    Merci,

    il semblerait quand déclarant la variable Reponse en la mettant en variable globale et non locale, la mémoire soit libérée. Cela vous semble être possible? Qu'en pensez vous?

    Merci
    Il faut être économe de son mépris en raison du grand nombre de nécessiteux (Chateaubriand)

Discussions similaires

  1. Problème de libération de mémoire
    Par ridecat dans le forum C
    Réponses: 13
    Dernier message: 06/05/2008, 08h36
  2. problème de libération de mémoire
    Par hamoudasafira dans le forum C++
    Réponses: 3
    Dernier message: 19/03/2007, 18h54
  3. Problème de libération de mémoire
    Par saturne13 dans le forum Linux
    Réponses: 9
    Dernier message: 06/02/2007, 09h18
  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