Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/05/2007, à 17:37

Criquet

Un problème de mémoire

Voila je suis en train de faire un programme en C++ qui a pour but de gérer de trés grands nombres (!999). Dans la classe que j'ai créer , GN, je déclare fait 2 constructeur, une qui prend un entier et le met dans un tableau d'entier (déclaré en allocation dynamique), j'ai testé le constructeure sa marche nickel. Puis j'ai fait un autre constructeur, casiment le même, qui lui prend une chaine de caractère (j'ai casiment rien eu à modifier).

Le problème c'est que quand je test les 2 en même temps j'ai de grosses erreurs de mémoire, que ce soit sur windaube ou sur linux, et j'ai passer mon code a un ami chez lui sa marche parfaitement, j'ai l'imprétion que les 2 tableau dynamique (celui du constructeur avec entier et l'autre) ce marchent dessu.

voila l'erreur quand j'exécute :

*** glibc detected *** ./main: munmap_chunk(): invalid pointer: 0x0804c038 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(cfree+0x1bb)[0xb7ce3f5b]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7ea1d11]
/usr/lib/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1d)[0xb7e7ea5d]
/usr/lib/libstdc++.so.6(_ZNSsD1Ev+0x57)[0xb7e815e7]
./main[0x80498bf]
./main(__gxx_personality_v0+0x1ab)[0x8048c3b]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb7c8eebc]
./main(__gxx_personality_v0+0x61)[0x8048af1]
======= Memory map: ========
08048000-0804b000 r-xp 00000000 03:41 7274595    /home/criquet/Desktop/C++/main
0804b000-0804c000 rw-p 00002000 03:41 7274595    /home/criquet/Desktop/C++/main
0804c000-0806d000 rw-p 0804c000 00:00 0          [heap]
b7c78000-b7c79000 rw-p b7c78000 00:00 0 
b7c79000-b7db4000 r-xp 00000000 03:41 7685378    /lib/tls/i686/cmov/libc-2.5.so
b7db4000-b7db5000 r--p 0013b000 03:41 7685378    /lib/tls/i686/cmov/libc-2.5.so
b7db5000-b7db7000 rw-p 0013c000 03:41 7685378    /lib/tls/i686/cmov/libc-2.5.so
b7db7000-b7dba000 rw-p b7db7000 00:00 0 
b7dba000-b7dc5000 r-xp 00000000 03:41 7651392    /lib/libgcc_s.so.1
b7dc5000-b7dc6000 rw-p 0000a000 03:41 7651392    /lib/libgcc_s.so.1
b7dc6000-b7deb000 r-xp 00000000 03:41 7685386    /lib/tls/i686/cmov/libm-2.5.so
b7deb000-b7ded000 rw-p 00024000 03:41 7685386    /lib/tls/i686/cmov/libm-2.5.so
b7ded000-b7ecc000 r-xp 00000000 03:41 9586605    /usr/lib/libstdc++.so.6.0.8
b7ecc000-b7ecf000 r--p 000de000 03:41 9586605    /usr/lib/libstdc++.so.6.0.8
b7ecf000-b7ed1000 rw-p 000e1000 03:41 9586605    /usr/lib/libstdc++.so.6.0.8
b7ed1000-b7ed8000 rw-p b7ed1000 00:00 0 
b7ee7000-b7ee8000 rw-p b7ee7000 00:00 0 
b7ee8000-b7f01000 r-xp 00000000 03:41 7651349    /lib/ld-2.5.so
b7f01000-b7f03000 rw-p 00019000 03:41 7651349    /lib/ld-2.5.so
bf953000-bf969000 rw-p bf953000 00:00 0          [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]
Abandon (core dumped)
criquet@criquet-desktop:~/Desktop/C++$

Dernière modification par Criquet (Le 25/05/2007, à 17:38)

Hors ligne

#2 Le 25/05/2007, à 22:44

Le Farfadet Spatial

Re : Un problème de mémoire

Salut à tous !

   Criquet, si tu nous donnais ton code, il y aurait plus de chance que nous puissions te venir en aide.

   À bientôt.

                                                                                                                                                Le Farfadet Spatial

Hors ligne

#3 Le 26/05/2007, à 09:32

Criquet

Re : Un problème de mémoire

Voila les 2 constructeur

//Constructeur qui initialise le tableau//
//avec un entier entré en paramètre//
GN::GN(int nb) {
       char nbchar[100];
       int j=0, i=0, cpt=0;
       string nbchar2, chain;
       
       sprintf(nbchar,"%d",nb); 
       
       //si la taille est un multiple de 3//
      if ((strlen(nbchar)%3)==0){
          taille=(strlen(nbchar)/3);
       }
       
      else taille=(strlen(nbchar)/3)+1;
      tab=new(nothrow) int (taille);
       i=taille;
       nbchar2=nbchar;
       //affectation dans le tableau//
      while (i>=1){
          do {
              j++;
              if (j%3==0){
                  i--;
                  chain = nbchar2.substr(cpt,3);
                  tab[i]=atoi(chain.c_str());
                  cpt+=3;   
                      }
          }
          //Si le nombre de chiffre n'est pas un multiple de 3//
          while (j<(strlen(nbchar)));
          i--;
          chain = nbchar2.substr(cpt,(strlen(nbchar)-cpt));
          tab[i]=atoi(chain.c_str());      
       }
      
}


//constructeur qui reçoie une chaine de caractère et//
//et qui initialise le chiffre avec cette chaine//
GN::GN (string nbchar) {
       int j=0, i=0, cpt=0,test;
       string chain;
       

       //si la taille est un multiple de 3//
      if ((nbchar.length()%3)==0){
          taille=(nbchar.length()/3);
       }
       
      else taille=((nbchar.length()/3)+1);
      tab=new(nothrow) int (taille);
       i=taille;
       
       //affectation dans le tableau//
      while (i>=1){
          do {
              j++;
              if (j%3==0){
                  i--;
                  chain = nbchar.substr(cpt,3);
                  tab[i]=atoi(chain.c_str());
                  cpt+=3;   
                      }
          }
          //Si le nombre de chiffre n'est pas un multiple de 3//
          while (j<(nbchar.length()));
          i--;
          chain = nbchar.substr(cpt,(nbchar.length()-cpt));
          tab[i]=atoi(chain.c_str());      
       }
      
}

Hors ligne

#4 Le 26/05/2007, à 21:41

Le Farfadet Spatial

Re : Un problème de mémoire

Salut à tous !

   Deux petites questions : pourquoi n'utilises-tu pas la classe vector de la bibliothèque standard, c'est performant et la gestion de la mémoire y est bien faite ? Pourquoi utiliser nothrow ?

   À bientôt.

                                                                                                                                                Le Farfadet Spatial

Hors ligne