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

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Fuite de mémoire ? Pourquoi ?


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

Fuite de mémoire ? Pourquoi ?

jeudi 13 novembre 2008 à 10:55:22 | Fuite de mémoire ? Pourquoi ?

steph12358

Bonjour à tous

Pour tester un problème rencontré dans une de mes applis j'ai créé une autre petite appli et mis le code suivant exécuté dans un timer.

Il ne fait qu'allouer un grand nombre de pointeurs pour les libérer immédiatement mais présente le même problème rencontré dans lautre appli.

Voilà mon soucis:
J'affiche le gestionnaire de programme Windows et affiche les processus.

Si je ne touche à rien pendant le fonctionnement tout va bien :
Le programme alloue et libère bien la mémoire:
après le pic je retombe toujours sur la mémoire utilisée au démarrage...

Mais si je provoque des événements windows (ex: survol de la barre de tache, clic sur le menu démarrer, ouverture d'un dossier, déplacement d'une fenêtre)
mon programme se met à utiliser plus de mémoire : je ne retombe plus sur la valeur au démarrage (+4ko, +8ko et plus parfois)
A la longue ça finit par faire beaucoup

A quoi est-ce dù et quelqu'un a t'il déjà rencontré ce problème ?

Voilà le code de test (j'utilise C++ builder v 5)

"
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   static int iter=0;
   static int nberr=0;

   long *ordre;
   char **listOfItem=0;
   int nbelts = 1000000;      //1 000 000 ouf!
   int erreur = 0;
   bool memok;

   memok = true;

   listOfItem = NULL;
   ordre = NULL;

   try
   {
      if (memok)
         ordre = new long[nbelts ];         // max de nb éléments
      memok = memok & (ordre != NULL);

      if (memok)
         listOfItem = new char*[nbelts ];   // max de nb éléments
      memok = memok & (listOfItem != NULL);

      if (memok)
      {
         //Affectation des pointeurs
         for (int i=0; i<nbelts ; i++)
            listOfItem[i] = NULL;

         for (int i=0; i<nbelts; i++)
         {
            listOfItem[i] = new char[256];
            if ( listOfItem[i] != NULL )
               memset(listOfItem[i], 0, 256);
            else
            {
               memok = false;
               for (int i=i-1; i>=0; i--)
               {
                  if (listOfItem[i] != NULL)
                  {
                     delete [] listOfItem[i];
                     listOfItem[i] = NULL;
                  }
               }
               if (listOfItem != NULL)
               {
                  delete [] listOfItem;
                  listOfItem = NULL;
               }
               if (ordre != NULL)
               {
                  delete [] ordre;
                  ordre = NULL;
               }
               nbelts = 0;
               erreur = 1;
            }
         }
      }
   }
   catch (Exception &exception)
   {
      memok = false;
   }

   //Libération des pointeurs

   if (listOfItem != NULL)
   {
      for (int i=nbelts-1; i>=0; i--)
      {
         if (listOfItem[i] != NULL)
            delete [] listOfItem[i];
      }
      delete [] listOfItem;
   }

   if (ordre != NULL)
      delete [] ordre;

   if (! memok)
      nberr++;

   iter++;
   Edit1->Text = AnsiString(iter);

   Edit2->Text = AnsiString(nberr);
}
"

Si quelqu'un peut éclairer ma lanterne.

D'avance Merci

PS: j'ai essayé de faire un "catch (std::bad_alloc &e)"
mais le compilo me dit que "bad_alloc" ne fait pas partie de std (???).
De toute façon quand l'exception se produit le programme ne libère pas la mémoire et se vautre lamentablement (ex:   avec int nbelts = 10 000 000)
on crashe et fin du voyage (abnormal program termination)
jeudi 13 novembre 2008 à 11:29:58 | Re : Fuite de mémoire ? Pourquoi ?

gamemonde

Membre Club
petit probleme ici

for (int i=i-1; i>=0; i--)

i ne peux pas etre valoir i-1  car i ne vaux rien encore
// tu devrai verifier si le i est celui de ta premiere boucle ou celui que tu tentes d'initialiser.
jeudi 13 novembre 2008 à 13:49:06 | Re : Fuite de mémoire ? Pourquoi ?

steph12358

Salut gamemonde

Merci pour ta réponse.
Effectivement il y a avait un problème, c'était pas très propre...
J'ai rectifié mais mon prog joue toujours la passoire dès que je "bouge" une oreille (enfin, je veux dire quand j'interagis avec le bureau )

"void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   static int iter=0;
   static int nberr=0;

   long *ordre;
   char **listOfItem=0;
   long nbmax = 1000000;            //1 000 000
   long nbitems;
   bool memok;

   memok = true;

   listOfItem = NULL;
   ordre = NULL;
   nbitems=0;

   try
   {
      if (memok)
         ordre = new long[nbmax];         // max de nb éléments
      memok = memok & (ordre != NULL);

      if (memok)
         listOfItem = new char*[nbmax];   // max de nb éléments
      memok = memok & (listOfItem != NULL);

      if (memok)
      {
         //Affectation des pointeurs
         for (int i=0; i<nbmax; i++)
            listOfItem[i] = NULL;

         for (int i=0; i<nbmax; i++)
         {
            listOfItem[i] = new char[256];
            if ( listOfItem[i] != NULL )
            {
               memset(listOfItem[i], 0, 256);
               nbitems++;
            }
            else
            {
               memok = false;
               for (int i=0; i<nbitems; i++)
               {
                  if (listOfItem[i] != NULL)
                  {
                     delete [] listOfItem[i];
                     listOfItem[i] = NULL;
                  }
               }
               if (listOfItem != NULL)
               {
                  delete [] listOfItem;
                  listOfItem = NULL;
               }
               if (ordre != NULL)
               {
                  delete [] ordre;
                  ordre = NULL;
               }
               nbitems = 0;
            }
         }
      }
   }
   catch (...)
   {
      memok = false;
   }

   //Libération des pointeurs

   if (listOfItem != NULL)
   {
      for (int i=0; i<nbitems; i++)
      {
         if (listOfItem[i] != NULL)
         {
            delete [] listOfItem[i];
            listOfItem[i] = NULL;
         }
      }
      delete [] listOfItem;
      listOfItem = NULL;
   }

   if (ordre != NULL)
   {
      delete [] ordre;
      ordre = NULL;
   }

   if (! memok)
      nberr++;

   iter++;
   Edit1->Text = AnsiString(iter);
   Edit2->Text = AnsiString(nberr);

 
}"


jeudi 13 novembre 2008 à 15:56:42 | Re : Fuite de mémoire ? Pourquoi ?

steph12358

Arghhh!!!

J'ai confondu new et malloc.
new ne renvoie jamais NULL en cas d'erreur mais déclenche une exception:
J'ai simplifié le test. Mais toujours des pertes de mémoires lors d'événements
windows...

fonction appelée dans un Timer
bool TForm1::Test()
{
   long *ordre;
   char **listOfItem;
   long nbmax = 100000;
   long nbitems;
   bool memok;

   memok = true;
   nbitems=0;

   try
   {
      ordre = new long[nbmax];        
      listOfItem = new char*[nbmax];  
      //Affectation des pointeurs
      for (int i=0; i<nbmax; i++)
      {
         listOfItem[i] = new char[256];
         memset(listOfItem[i], 0, 256);
         nbitems++;
      }
   }
   catch (...)    //(std::bad_alloc)      //passe pas en compil: pas membre std?
   {
      memok = false;
   }

   for (int i=0; i<nbmax; i++)
      delete [] listOfItem[i];
   delete [] listOfItem;
   delete [] ordre;

   return memok;

}
mardi 18 novembre 2008 à 15:06:19 | Re : Fuite de mémoire ? Pourquoi ?

steph12358

Réponse acceptée !
Bonjour à tous !

ben finalement la fuite venait de ma gestion des événements windows
Un break manquant dans une boucle de recherche d'un indice et hop ! accès après la fin d'un tableau...

L'agriculture a besoin de bras. Je devrais peut être m'inscrire sur les listes !


Cette discussion est classée dans : int, ordre, if, listofitem, memok


Répondre à ce message

Sujets en rapport avec ce message

Table de hachage avec patronyme [ par guitoontruant ] Bonjour, Désolé, j'avais d'abord poster dans les discussions libres.Voilà je dois créer une table de hashage de patronymes par le biais de N entrées, maths et autres [ par jeanphilippe37 ] Slt, j'ai fais un prgm de maths pour savoir les nbrs premiers mais, quand je mets system("pause"), j'ai une erreur, pouvez vous me corriger ? rien ne s'affiche a l'execution(les tubes ordinaires) [ par brekiano ] bonsoir,  svp chui débutant dans la programmation systeme sous unix.j'ai fait ce programme qui affiche normalement le résultats de ce pipes :    ]$ ps BLITZ++ [ par ciaonataha ] Salut a tous!!!J'ai besoin d'aide..Qn travaillent avec biblioteque BLITZ++....Je veux recrier ça:for (int t=0; t {  for (int p=0; p     if (T==Tr(t metre der donner en ordre crosante ??? [ par li ] Comment metre des donner en ordre ???Mon code : ma class; class colision{public: <b Gestion de plusieurs ports RS232 [ par dissezfr ] Bonjour à tous d'abordJ'ai récupéré un code sur le site permettant de géré un port série, j'aimerai piloter 8 (voir +) ports série avec un seul ordina analyseur lexical pascal [ par perrotta ] Bonjour, dsl pour ma langue je parle pas bien le français; je suis entrin de devlopper un analyseur lexical pour un programme (pascal) prèci ,et j'ai ce code ne marche pas?????????? [ par banak3181 ] s'il vous plait les gars je veux que quelqu'un me disent pourquoi ce code ne marche sur dev C++:#include #include #include #include # include<myconio. aide jeux par C [ par ousous09 ] voila, quand je compile ca me donne cette erreur size of indefined or zero j'ai rien compris voila mon programme en C #include #include #include Communiquer entre processus avec des pipe [ par akrogames ] Bonjour, Je souhaite réaliser un programme pour m'entrainer à créer des anneaux avant de passer à la programmation socket. Mon objectif : faire pass


Nos sponsors


Sondage...

Comparez les prix

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

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