Pourquoi j'obtiens cette erreur d'accès mémoire "double gratuitement ou contre la corruption"?
Je reçois ce type de message d'erreur. Je sais qu'il a quelque chose à faire avec moi mal accédant à la mémoire, mais je n'ai pas exactement comment. S'il vous plaît aidez-moi de voir où je suis allé mal.
*remarque j'ai simplifié ma fonction et il n'est pas évident que les variables sont en train de faire, j'ai juste besoin de savoir comment je me suis mise en œuvre de la fonction de manière incorrecte ou si je suis mauvais usage de l'accès à la mémoire.
int my_function(char const *file_name, size_t max)
{
myStruct.pStore = fopen(file_name,"w+"); //pStore is a FILE*
myStruct.max = max;
//fill the with zeros ('0')
int numberOfZeros = max*SIZE;
char zeros[numberOfZeros];
int i=0;
while(i<numberOfZeros) //insert zero's
{
zeros[i]='0';
i++;
}
fwrite(zeros,sizeof(char),numberOfZeros,myStruct.pStore);
fclose(myStruct.pStore);
return EXIT_SUCCESS;
L'erreur que j'obtiens:
*** glibc detected *** /home/.../: double free or corruption (top): 0x0804c008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7e82e42]
/lib/i386-linux-gnu/libc.so.6(fclose+0x154)[0xb7e72384]
/home/2012/spatar/cs/specs/release[0x80486b0]
/home/2012/spatar/cs/specs/release[0x8048acd]
/home/2012/spatar/cs/specs/release[0x8048af0]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb7e284d3]
/home/2012/spatar/cs/specs/release[0x80484e1]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 00:3b 2331829 /home/2012/spatar/cs/Aspecs/release
0804a000-0804b000 r--p 00001000 00:3b 2331829 /home/2012/spatar/cs/specs/release
0804b000-0804c000 rw-p 00002000 00:3b 2331829 /home/2012/spatar/cs/specs/release
0804c000-0806d000 rw-p 00000000 00:00 0 [heap]
b7e0e000-b7e0f000 rw-p 00000000 00:00 0
b7e0f000-b7fae000 r-xp 00000000 00:11 5415 /lib/i386-linux-gnu/libc-2.15.so
b7fae000-b7fb0000 r--p 0019f000 00:11 5415 /lib/i386-linux-gnu/libc-2.15.so
b7fb0000-b7fb1000 rw-p 001a1000 00:11 5415 /lib/i386-linux-gnu/libc-2.15.so
b7fb1000-b7fb4000 rw-p 00000000 00:00 0
b7fbc000-b7fd8000 r-xp 00000000 00:11 5426 /lib/i386-linux-gnu/libgcc_s.so.1
b7fd8000-b7fd9000 r--p 0001b000 00:11 5426 /lib/i386-linux-gnu/libgcc_s.so.1
b7fd9000-b7fda000 rw-p 0001c000 00:11 5426 /lib/i386-linux-gnu/libgcc_s.so.1
b7fda000-b7fdd000 rw-p 00000000 00:00 0
b7fdd000-b7fde000 r-xp 00000000 00:00 0 [vdso]
b7fde000-b7ffe000 r-xp 00000000 00:11 5405 /lib/i386-linux-gnu/ld-2.15.so
b7ffe000-b7fff000 r--p 0001f000 00:11 5405 /lib/i386-linux-gnu/ld-2.15.so
b7fff000-b8000000 rw-p 00020000 00:11 5405 /lib/i386-linux-gnu/ld-2.15.so
bffdf000-c0000000 rw-p 00000000 00:00 0 [stack]
Montrer la partie du code où vous libérer de la mémoire.
L'utilisation d'un débogueur. L'utilisation d'un débogueur. L'utilisation d'un débogueur.
Le 'double' m'a conduit à demander la même chose au départ, mais il semble comme il est montré que l'ensemble de la fonction par le biais de l'instruction return.
Puisque cette fonction ni alloue ni libère de la mémoire via
Si vous
L'utilisation d'un débogueur. L'utilisation d'un débogueur. L'utilisation d'un débogueur.
Le 'double' m'a conduit à demander la même chose au départ, mais il semble comme il est montré que l'ensemble de la fonction par le biais de l'instruction return.
Puisque cette fonction ni alloue ni libère de la mémoire via
malloc()
et free()
, il est très, très peu probable que cette fonction est la cause directe de la peine. Il n'est pas clair qu'il appelle tout ce qui va causer des problèmes. Je vous recommande d'essayer valgrind
.Si vous
fclose()
à nouveau le même fichier en dehors de my_function()
, vous pouvez exécuter ce problème.
OriginalL'auteur spatara | 2012-09-23
Vous devez vous connecter pour publier un commentaire.
Il semble que vous essayez de libérer de la mémoire qui a déjà été libérée ou a été déréférencé.
Lien de votre programme avec efence ou valgrind.
Cela vous indiquera où le pointeur de la souris devient déréférencé.
Juste après, la partie où vous libérer de la mémoire, et nous pouvons trouver l'erreur dans deux minutes.
OriginalL'auteur Gung Foo
De corruption de la mémoire est généralement causée par l'écriture au-delà de la fin de l'allocation de la mémoire, et souvent, c'est par un octet parce que quelqu'un a oublié d'ajouter un octet nécessaires pour la valeur null pour mettre fin à une chaîne.
Double gratuit gratuit(x) a été appelé deux fois de suite avec la même valeur de x. Quelque part dans votre code gratuit(x) est appelé et il est alors probable que dans un autre morceau de code gratuit(x) est appelée de nouveau.
La façon la plus simple d'isoler le problème est l'utilisation de gdb et observer ce qui se passe au fur et à mesure de votre code.
Dans votre my_function code ci-dessus, il n'y a pas d'appels à malloc ou gratuit. Les zéros de tampon sur la pile et la boucle while ne pas écrire au-delà de la fin de la mémoire tampon. Le problème est dans une autre partie du code. Combien de temps il faut pour corriger le problème(s) dépend de la façon dont de nombreux endroits malloc/free/strdup etc. ils sont appelés à partir.
OriginalL'auteur Arun Taylor