begin process at 2012 05 29 23:29:28
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

liberation de memoire


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

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

ghuysmans99

Membre Club

Exact. Surtout fais attention à faire delete[] et pas delete tout seul. Sinon il ne va libérer qu'un octet.

---
VB.NET is good ... VB6 is better

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(


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,515 sec (4)

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