begin process at 2012 05 29 15:43:49
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

petite question concernant malloc et free...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

petite question concernant malloc et free...

dimanche 6 juin 2004 à 20:01:32 | petite question concernant malloc et free...

kod32

Salut,
je me pose une question depuis un petit moment et je pense que vous avez la réponse...

Quand on alloue quelques octets via malloc, si on évite l'appel de free pour libérer, la libération se fait lors de la fermeture du programme. Mais qu'en est il pour la fin d'une fonction...

Je m'explique par un exemple. Voici une fonction basique de convertion minuscule -> majuscule :
---------------
char *min_maj(char *string)
{
int c, i;
char buf[1];
char *pStr = (char *)malloc(strlen(string)+1);
memset(pStr, 0, strlen(pStr));
for(i=0; i <= strlen(string); i++)
{
c = string[i];
if((c <= 122) && (c >= 97))
c -= 32;
sprintf(buf, "%c", c);
strcat(pStr, buf);
}
string = pStr;
return string;
}
---------------
pour libérer l'allocation de pStr, il faudrait mettre un free(pStr) juste avant return string;
Or si on fait cela, la fonction ne retournera plus rien puisque string pointe sur la mémoire allouée.
Est ce que la mémoire est libérée automatiquement à la fin de l'exécution de la fonction ? Si ce n'est pas le cas, que fais t'on en général pour la libération d'un pointeur malloqué en local dans une fonction ?

Merci
dimanche 6 juin 2004 à 20:10:24 | Re : petite question concernant malloc et free...

AlexMAN

Membre Club
Bon d'abord jne pense pas ke retourner une chaine de caractere de classe d'allocation automatik soit une bonne idée, car a la fin de la fonction, cette chaine sera "detruite" donc ta fonction pointera vers un emplacement ki pourrait etre modifié par d'autres données...
J'utilise une chaine globale (static) ke je retourne puis ke je libere apres l'appel de la fonction, jne sais pas si c bien, mais c ske je fais, et comme ca t sur de bien liberer l'espace memoire alloué...

Voila, jespere t'avoir repondu

++

Alhexman
dimanche 6 juin 2004 à 21:07:28 | Re : petite question concernant malloc et free...

BruNews

Administrateur CodeS-SourceS
A chaque malloc doit correspondre son free !!!
Aucune alloc dynamique ne se libere toute seule ni n'est detruite en sortie de fonction.
Essaie ceci pour t'en convaincre.

char* NouvChaine(char *psz)
{
char *pbuff;
pbuff = (char*) malloc(strlen(psz) + 8);
if(pbuff) {
strcpy(pbuff, "Salut ");
strcpy(pbuff + 6, psz);
}
return pbuff;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
char *c;
c = NouvChaine("la foule");
if(c) {
MessageBox(0, c, szappname, 0);
free(c);
}
return 0;
}

ciao...
BruNews, Admin CS, MVP Visual C++
dimanche 6 juin 2004 à 21:12:33 | Re : petite question concernant malloc et free...

kod32

donc dans ton exemple, le fait de faire un free(c) libère la mémoire allouée dynamiquement dans la fonction NouvChaine() ?
dimanche 6 juin 2004 à 21:16:38 | Re : petite question concernant malloc et free...

AlexMAN

Membre Club
BruNews, ds ton exemple, une fonction "peut " modifier l'espace alloué a c non ? par une autre allocation ou kelk chose come ca, dis moi si jme trompe
dimanche 6 juin 2004 à 21:25:54 | Re : petite question concernant malloc et free...

BruNews

Administrateur CodeS-SourceS
En theorie, l'espace alloue est reserve et ne pourra pas etre touche par une autre fonction. Rien n'empeche bien entendu de vouloir ecrire plus long qu'il n'y a d'espace reserve, auquel cas plantage ou ecrasement de donnees a prevoir.
free(c) libere bien la memoire allouee dans la fonction appelee, il ne faut surtout pas modifier c, du genre c++ ou autre fantaisie mais bien passer a free le resultat de malloc.

ciao...
BruNews, Admin CS, MVP Visual C++
dimanche 6 juin 2004 à 21:58:15 | Re : petite question concernant malloc et free...

kod32

ok, dc si j'ai bien compris, si j'utilise ma fonction comme ceci :
int main(int argc, char *argv[])
{
char *pString = min_maj("abcdef");
printf("%s\n", pString);
free(pString);
system("pause");
return 0;
}

ma mémoire sera bien libérée ?
dimanche 6 juin 2004 à 22:06:45 | Re : petite question concernant malloc et free...

BruNews

Administrateur CodeS-SourceS
OUI, free libere bien le pointeur retourne par malloc.

Par contre dans ta func:
char *pStr = (char *)malloc(strlen(string)+1);
memset(pStr, 0, strlen(pStr));
strlen(pStr) ???????
strlen compte de nombre d'octets jusqu'au 1er NULL trouve. Ici comment savoir ce qu'il y a dans cet emplacement memoire ? Y a-t-il meme un zero ?

len = strlen(string)+1;
char *pStr = (char *)malloc(len);
memset(pStr, 0, len);

Autre truc:
char buf[1];
tu aurais mis: char buf, c'etait idem.
On ne fera jamais une chaine de type C avec moins de 2 octets, il faut un ZERO final.

ciao...
BruNews, Admin CS, MVP Visual C++
dimanche 6 juin 2004 à 22:15:05 | Re : petite question concernant malloc et free...

kod32

Un grand merci à toi BruNews !


Cette discussion est classée dans : fonction, string, char, pstr, malloc


Répondre à ce message

Sujets en rapport avec ce message

Convertir une string en char* [ par dickymoe ] Existe-t-il une fonction qui permet de convertir une string en char* ?ou alors une fonction qui compare deux string sans respecté la casse ???Merci(en Probleme malloc [ par zzzzzz ] <img src=/imgs2 pb malloc [ par youpiyoyo ] d'apres msdn char *string; /* Allocate space for a path name */ string = malloc( _MAX_PATH );deja ca chez moi ca compil pas me compilo me di impos conversion du String^ to char* [ par adrianomad ] Salut.J'ai en face un grand pb. J'ai besoin d'une fonction qui me permet de convertir un String^ to char*. En effet, je voudrais lire un texte (nom de Fonction Crypto (XOR) [ par ghuysmans99 ] Bonjour à tous.J'ai fait une fonction de Crypto en XOR et évidemment, ça ne fonctionne pas Pourriez-vous me dire si c'est l'appel qui pose problème ou probleme creation de tableaux à taille dynamique [ par veka61 ] Bonjour tout le monde,Voila j'essai depuis plusieurs jour de creer une fonction pour transformer un string en char seulement j'obtient une erreur que Mélange bool / string [ par Roro8883 ] Bonjour à tous !J'ai un problème dans mon code, dans une classe.Voici les lignes posant problème :      int put_value (bool value, string file = "");  Différence char - string [ par herlockg ] Bonjour,Voilà, je me demandais quelle était la différence exacte entre le type string et le type char. De plus, il pourquoi n'est-il pas nécessaire d' probleme malloc !! [ par Vinsininounet ] Bonjour a tous,J'ai un probleme TRES bizzarre :quand je fait :char* pointeur;pointeur = malloc(sizeof(char)*1000);sa me met :invalide conversion de vo fonction pour "écrire" une variable [ par kenjomaster ] Bonjour,J'arrive à positionner un curseur, faire un clic, simuler une ou plusieurs combinaisons de touches.Mais je ne sais pas écrire une variable (du


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,952 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales