Pages : 1
#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
Pages : 1