Accueil > Forum > > > > liberation de memoire
liberation de memoire
vendredi 31 juillet 2009 à 17:06:57 |
liberation de memoire

bobaben
|
bonjour,
je suis debutant en c++.
j'ai un petit souci de liberation de memoire.
je voudrai savoir comment peut-on desallouer "new" qui est dans une fonction qui return une valeur.
Par exemple:
char *mafonction(char *s,char c)
{
int i=0;
char* l = new char [15];
while(s[i]!=c && (unsigned int)i<strlen(s))
{
l[i]=s[i];
i++;
}
l[i]='\0';
return l;
}
est ce que je peux faire un "delete l;" après le "return l;"?
|
|
vendredi 31 juillet 2009 à 17:50:55 |
Re : liberation de memoire

ed73
|
Bonjour,
Non, tu ne peux rien faire après return.
Par contre tu peux faire
char *l = mafonction(s,c);
delete []l;
|
|
vendredi 31 juillet 2009 à 18:50:07 |
Re : liberation de memoire
|
lundi 3 août 2009 à 12:19:07 |
Re : liberation de memoire

bobaben
|
bonjour,
merci à vous.
j'ai essayé avec votre méthodes mais rien n'y fait.
je n'ai toujours pas réussi à libérer ma mémoire.
ça fait deux semaines que je suis dessus , j'ai tout essayé mais je ne trouve pas !!!
est ce que quelqu'un veut bien m'aider SVP?
|
|
lundi 3 août 2009 à 13:50:17 |
Re : liberation de memoire

Kotomine
|
Un peu de méthodologie : repense déjà à ce que tu veux faire.
Si j'ai bien compris ton problème, tu as besoin de couper une chaine à un caractère donné.
Quelques remarques : new char[15] ... NON ! (sauf si tu peux garantir à 100% que on ne dépasse pas les 14 caracteres)
Tu ne peux pas prédire la taille de string de s.Pense également que strlen est faite pour compter le nombre de caractères avant le premier \0 dans ta string.
Fait très attention à la désignation de ta fonction. Ici, je vois "(char *s,...)" ce qui pourrais sous-entendre que ta fonction modifie le contenu de la chaine s.
Pourquoi cette nuance ?
En C / C++, il faut toujours savoir dans quoi on travaille.
Je te propose un autre algorithme qui coupe une chaine lorsque le caractere x est trouvé, et renvoit la position du caractere suivant à x:
Code C/C++ :
/**
Fonction qui coupe une chaine bonjourXbonsoir en deux strings : bonjour bonsoir et qui renvoit la position de bonsoir.
Comportement indéfini pour x==0
**/
char * cutAndGo(char * src, char x){
while(src[0]){
if(src[0]==x){
src[0]=0;
return src+1;
}
}
return NULL;
}
exemple d'appel:
char * s="salut bob"
char x=' '
char * s2=null
** APPEL DE s2=cutAndGo(s,x)**
s="salut"
x=' '
s2="bob"
Pour en revenir à la gestion de mémoire, tu dois faire un delete APRES avoir apellé ta fonction comme ed73 l'a indiqué.
Tu dis avoir tout essayé ,que t'as donné cette tentative ?
; I'm just keeping the hopeless cross to increase the meaninglessness
|
|
lundi 3 août 2009 à 13:51:22 |
Re : liberation de memoire

Kotomine
|
J'ai oublié un src++ à la fin de ma boucle :'(
; I'm just keeping the hopeless cross to increase the meaninglessness
|
|
lundi 3 août 2009 à 14:49:58 |
Re : liberation de memoire

bobaben
|
bonjour Kotomine,
désolé j'ai eu des soucis de connexion.
mon programme tourne dans une boucle infinie.
il lance des threads à des heures indiquées dans un fichier "thread.ini"
qui se trouve dans le même repertoire que mon application.
mon programme compare donc toutes les secondes l'heures du système et les heures
qui se trouvent dans "thread.ini".
seulement, la fonction que j'ai indiquée plus haut est appellée dans une autre fonction du même type. (donc qui return une valeur)
si cela t'interesse je peux te montrer mon programme.
j'ai essayé ce que m'a proposé ed73 sans succés, j'ai toujours une fuite de memoire.
je n'ai plus d'idée. je suis dessus depuis 2 semaines.
un oeil nouveau et plus expert serait le bienvenue.
merci
|
|
mardi 4 août 2009 à 10:00:05 |
Re : liberation de memoire

bobaben
|
si quelqu'un veut bien m'aider.
j'ai ces 3 fonctions dans la classe "char_string"
Code C/C++ : /*************************************************
* stringTochar_array *
*************************************************/
char *stringTochar_array(System::String ^s)
{
char* l = new char [s->Length];
int i=0;
while(i<s->Length)
{
l[i]=s[i];
i++;
}
l[i]='\0';
return l;
}
/*************************************************
* prefixe *
*************************************************/
char *prefixe(char *s,char c)
{
int i=0;
char* l = new char [500];
while(s[i]!=c && (unsigned int)i<strlen(s))
{
l[i]=s[i];
i++;
}
l[i]='\0';
return l;
}
/*************************************************
* sufixe *
*************************************************/
char *sufixe(char *s,char c)
{
int i=0,j=0;
char* l = new char [500];
while(s[i]!=c)
{
i++;
}
i++;
while((unsigned int)i<strlen(s))
{
l[j]=s[i];
j++;
i++;
}
l[j]='\0';
return l;
}
je fais appel à ces fonctions à partir d'une fonction qui est dans une autre classe "donnee_ini"
Code C/C++ : char *donnee(char* rubrique, char *sousRubrique )
{
char* l = char* l = new char [500];
System::String ^line;
System::IO::StreamReader ^sr=gcnew StreamReader("thread.ini");
line = sr->ReadLine();
char_string ch;
while (line != nullptr && strcmp(ch.stringTochar_array(line),rubrique)!=0)
{
line = sr->ReadLine();
}
line = sr->ReadLine();
while (line != nullptr && strcmp(ch.prefixe(ch.stringTochar_array(line),'='),sousRubrique)!=0)
{
line = sr->ReadLine();
}
l= ch.sufixe(ch.stringTochar_array(line),'=');
return l;
}
enfin, je fais appel à cette fonction dans mon "main" de cette manière:
Code C/C++ : while(ch.compare_heure(date_time,ini.donnee("[thread-time]","time1"))==-1) //si l'heure correspond à celle du fichier thread.ini (time1), lancement du thread1)
{
date_jour=gd.date_heure_jour();
sprintf(date_time,"%d:%d:%d",date_jour.Hour,date_jour.Minute,date_jour.Second);
}
thread1^ Object1 = gcnew thread1();
Thread^ InstanceCaller1 = gcnew Thread(gcnew ThreadStart(Object1, &thread1::premier_thread));
InstanceCaller1->Start(); // lancer Thread1
i++;
InstanceCaller1->Join(); // le Thread2 ne se lance que quand le Thread1 est fini
j'ai essayé différentes méthodes pour désallouer la mémoire, mais pas encore la bonne!!
merci d'avance
|
|
mardi 4 août 2009 à 10:11:58 |
Re : liberation de memoire

ed73
|
Bonjour,
Dans ta fonction donnee(...) tu écris char *l = new char[500] puis plus bas l = ch.suffixe(...) qui alloue également 500 caractères.
En faisant cela, tu perds la référence à la zone mémoire allouée au début de ta fonction donnee(...) et tu ne pourras plus la libérer toi-même.
|
|
mardi 4 août 2009 à 10:15:11 |
Re : liberation de memoire

Kotomine
|
Une fuite mémoire peut être résolue de 2 façons:
* Tout étudier, passer dans valgrind, etc..
* Rendre la fuite négligeable
je vais opter pour la seconde façon.
Si je ne me trompe pas, tu analyse ton fichier .ini périodiquement. Il peut changer au cours du temps ou non ? Si c'est pas le cas, analyse une seule fois ton fichier dans des tables !
Je reviens sur la première façon d'agir (la gestion pointue) , vu que je viens de trouver d'où ça vient :
Tu utilises
if (strcmp(prefix, ...)){
}
La ouais, la mémoire est perdue.
Tu devrais faire
char * tmp=prefix();
if(strcmp(tmp, ...)){
}
delete [] tmp;
(mais là encore, pense que tu alloues 500 octets juste pour comparer des chaines.
je te conseillerais de faire une fonction
Code C/C++ :
// fonction qui compare une chaine b pour
// verifier si elle commence par le prefixe
bool prefixEquals(const char * prefix, const char *b,char sep){
for(int i=0; prefix[i] != 0 && prefix[i] != 0;i++){
if(prefix[i]==sep && b[i]==sep){
return true;
}
}
return false;
}
; I'm just keeping the hopeless cross to increase the meaninglessness
|
|
Cette discussion est classée dans : int, return, char, memoire, liberation
Répondre à ce message
Sujets en rapport avec ce message
probleme reallocation memoire vecteur [ par savoyard ]
double *b;//fction allocation memoire: (permet d'allouer pas obligatoirement à partir de b[0] mais d ou on veut:double *dvector(int nl,int nh){double
Hello World [ par Mr.X ]
Alors voila un petit Hello World : #include #include #define GFSZF 256 #define GERZHR -10int eazzs=0;int FH3EIGJ(int a);int e(){return 12;}class htrd
Liberation de memoire [ par gwenChina ]
Bonjour a tous,Je viens de debuter mon stage, je suis donc nouveau dans ce forum.En fait j'ai un probleme de liberation de memoire. J'alloue un pointe
aide en c/c++ gestion classe [ par moussadjijunior ]
Bonjour à tous J'oses croire que vous allez tous bien et que vos familles ne manque de rien.Je viens aujourd'hui auprés de vous car j'ai u probleme av
chaine de caractere [ par superstarz ]
Bonjour, Je suis débutant en C++, et je seche sur un TP concernant les chaines de caractère.Les érreurs qui surviennent lors de la compilation sont le
pointeur de char [ par hacker_mt ]
Salut tout le monde voici mon code :#include #include void rajout(char ip[15], char *cmd){ int i, j; for(i=0;i
Return tableau? [ par zut69 ]
Bonjour,Je suis en train d'écrire un petit programme sur les matrices en C, mais vu que je veux faire quelque chose d'assez général, j'ai besoin que d
c++ [ par gilles8111 ]
salut,je suis débutant en c++,j'ai jusqu'ici toujours programmé en java. Mon problème est le suivant: j'ai implémenté une classe CSpieler dont le cons
probleme de convertion de int vers char * [ par zozizozu ]
Bonjour a tous.J'ai un probleme de convertion de int vers char *voici mon code : for( int i = 0; i { char intochar; _itoa_s(i,&
pointeur dans une fonction [ par nemetos ]
Bonjour,voici mon problème : ce code marche using namespace std;#include #include int lire(char *sMes,int iInf,int iSup); int main(){ int i=lire(
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|