Erreur: free(): invalid suivant la taille (rapide):
Quel est cet étrange erreur que je reçois? Je suis de la compilation C++ à l'aide de g++ sous Ubuntu 10.10. Il apparaît de façon aléatoire lorsque je lance l'exécutable (peut-être 2 fois en 8 heures, avec 10 compile une heure). Cependant, si je fais le nettoyer et de le recompiler disparaît la plupart du temps.
*** glibc detected *** ./emailQueue.app: free(): invalid next size (fast): 0x0000000001c40270 ***
======= Backtrace: =========
/lib/libc.so.6(+0x774b6)[0x7f490d95e4b6]
/lib/libc.so.6(cfree+0x73)[0x7f490d964c83]
./emailQueue.app[0x401f47]
/lib/libc.so.6(__libc_start_main+0xfe)[0x7f490d905d8e]
./emailQueue.app[0x401cc9]
======= Memory map: ========
00400000-0040d000 r-xp 00000000 08:01 1311132 /home/server/Projects/email/emailQueue.app
0060d000-0060e000 r--p 0000d000 08:01 1311132 /home/server/Projects/email/emailQueue.app
0060e000-0060f000 rw-p 0000e000 08:01 1311132 /home/server/Projects/email/emailQueue.app
01c40000-01c82000 rw-p 00000000 00:00 0 [heap]
7f4908000000-7f4908021000 rw-p 00000000 00:00 0
7f4908021000-7f490c000000 ---p 00000000 00:00 0
7f490ce52000-7f490ce5e000 r-xp 00000000 08:01 1051251 /lib/libnss_files-2.12.1.so
7f490ce5e000-7f490d05d000 ---p 0000c000 08:01 1051251 /lib/libnss_files-2.12.1.so
7f490d05d000-7f490d05e000 r--p 0000b000 08:01 1051251 /lib/libnss_files-2.12.1.so
7f490d05e000-7f490d05f000 rw-p 0000c000 08:01 1051251 /lib/libnss_files-2.12.1.so
7f490d05f000-7f490d075000 r-xp 00000000 08:01 1048770 /lib/libz.so.1.2.3.4
7f490d075000-7f490d275000 ---p 00016000 08:01 1048770 /lib/libz.so.1.2.3.4
7f490d275000-7f490d276000 r--p 00016000 08:01 1048770 /lib/libz.so.1.2.3.4
7f490d276000-7f490d277000 rw-p 00017000 08:01 1048770 /lib/libz.so.1.2.3.4
7f490d277000-7f490d28e000 r-xp 00000000 08:01 1051248 /lib/libnsl-2.12.1.so
7f490d28e000-7f490d48d000 ---p 00017000 08:01 1051248 /lib/libnsl-2.12.1.so
7f490d48d000-7f490d48e000 r--p 00016000 08:01 1051248 /lib/libnsl-2.12.1.so
7f490d48e000-7f490d48f000 rw-p 00017000 08:01 1051248 /lib/libnsl-2.12.1.so
7f490d48f000-7f490d491000 rw-p 00000000 00:00 0
7f490d491000-7f490d49a000 r-xp 00000000 08:01 1051244 /lib/libcrypt-2.12.1.so
7f490d49a000-7f490d69a000 ---p 00009000 08:01 1051244 /lib/libcrypt-2.12.1.so
7f490d69a000-7f490d69b000 r--p 00009000 08:01 1051244 /lib/libcrypt-2.12.1.so
7f490d69b000-7f490d69c000 rw-p 0000a000 08:01 1051244 /lib/libcrypt-2.12.1.so
7f490d69c000-7f490d6ca000 rw-p 00000000 00:00 0
7f490d6ca000-7f490d6e2000 r-xp 00000000 08:01 1051256 /lib/libpthread-2.12.1.so
7f490d6e2000-7f490d8e1000 ---p 00018000 08:01 1051256 /lib/libpthread-2.12.1.so
7f490d8e1000-7f490d8e2000 r--p 00017000 08:01 1051256 /lib/libpthread-2.12.1.so
7f490d8e2000-7f490d8e3000 rw-p 00018000 08:01 1051256 /lib/libpthread-2.12.1.so
7f490d8e3000-7f490d8e7000 rw-p 00000000 00:00 0
7f490d8e7000-7f490da61000 r-xp 00000000 08:01 1048743 /lib/libc-2.12.1.so
7f490da61000-7f490dc60000 ---p 0017a000 08:01 1048743 /lib/libc-2.12.1.so
7f490dc60000-7f490dc64000 r--p 00179000 08:01 1048743 /lib/libc-2.12.1.so
7f490dc64000-7f490dc65000 rw-p 0017d000 08:01 1048743 /lib/libc-2.12.1.so
7f490dc65000-7f490dc6a000 rw-p 00000000 00:00 0
7f490dc6a000-7f490dc7f000 r-xp 00000000 08:01 1048655 /lib/libgcc_s.so.1
7f490dc7f000-7f490de7e000 ---p 00015000 08:01 1048655 /lib/libgcc_s.so.1
7f490de7e000-7f490de7f000 r--p 00014000 08:01 1048655 /lib/libgcc_s.so.1
7f490de7f000-7f490de80000 rw-p 00015000 08:01 1048655 /lib/libgcc_s.so.1
7f490de80000-7f490df02000 r-xp 00000000 08:01 1051246 /lib/libm-2.12.1.so
7f490df02000-7f490e101000 ---p 00082000 08:01 1051246 /lib/libm-2.12.1.so
7f490e101000-7f490e102000 r--p 00081000 08:01 1051246 /lib/libm-2.12.1.so
7f490e102000-7f490e103000 rw-p 00082000 08:01 1051246 /lib/libm-2.12.1.so
7f490e103000-7f490e1eb000 r-xp 00000000 08:01 4853329 /usr/lib/libstdc++.so.6.0.14
7f490e1eb000-7f490e3ea000 ---p 000e8000 08:01 4853329 /usr/lib/libstdc++.so.6.0.14
7f490e3ea000-7f490e3f2000 r--p 000e7000 08:01 4853329 /usr/lib/libstdc++.so.6.0.14
7f490e3f2000-7f490e3f4000 rw-p 000ef000 08:01 4853329 /usr/lib/libstdc++.so.6.0.14
7f490e3f4000-7f490e409000 rw-p 00000000 00:00 0
7f490e409000-7f490e5c7000 r-xp 00000000 08:01 4851315 /usr/lib/libmysqlclient.so.16.0.0
7f490e5c7000-7f490e7c7000 ---p 001be000 08:01 4851315 /usr/lib/libmysqlclient.so.16.0.0
7f490e7c7000-7f490e7cc000 r--p 001be000 08:01 4851315 /usr/lib/libmysqlclient.so.16.0.0
7f490e7cc000-7f490e816000 rw-p 001c3000 08:01 4851315 /usr/lib/libmysqlclient.so.16.0.0
7f490e816000-7f490e817000 rw-p 00000000 00:00 0
7f490e817000-7f490e837000 r-xp 00000000 08:01 1048597 /lib/ld-2.12.1.so
7f490ea15000-7f490ea1c000 rw-p 00000000 00:00 0
7f490ea33000-7f490ea37000 rw-p 00000000 00:00 0
7f490ea37000-7f490ea38000 r--p 00020000 08:01 1048597 /lib/ld-2.12.1.so
7f490ea38000-7f490ea39000 rw-p 00021000 08:01 1048597 /lib/ld-2.12.1.so
7f490ea39000-7f490ea3a000 rw-p 00000000 00:00 0
7fffb85b9000-7fffb85da000 rw-p 00000000 00:00 0 [stack]
7fffb85ff000-7fffb8600000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted
- Un point-virgule manquant la cause de cette erreur pour moi.
Vous devez vous connecter pour publier un commentaire.
Cela signifie que vous avez une erreur de mémoire. Vous pouvez essayer de
free
un pointeur qui n'a pas été affecté parmalloc
(oudelete
un objet qui n'a pas été créé parnew
) ou vous pouvez essayer defree
/delete
un tel objet plus d'une fois. Vous avez peut-être débordement de tampon ou autrement écrit à la mémoire de qui vous ne devriez pas être écrit, causant la corruption de segment.N'importe quel nombre d'erreurs de programmation peuvent causer ce problème. Vous avez besoin d'utiliser un débogueur, obtenir une trace de débogage, et de voir ce que votre programme est en train de faire lorsque l'erreur se produit. Si ceci échoue, et vous constatez que vous avez corrompu le tas à un certain point antérieur dans le temps, vous pouvez peut-être pour quelques douloureux de débogage (il ne peut pas être trop douloureux si le projet est assez petit pour que vous pouvez s'attaquer à ce morceau par morceau).
J'ai rencontré le même problème, même si je n'ai pas fait toute allocation dynamique de la mémoire dans mon programme, mais j'ai accès à un vecteur d'index sans allouer de mémoire pour elle.
Donc, si le même cas, mieux allouer de la mémoire à l'aide de
resize()
et ensuite accéder aux éléments vectoriels.Nous avons besoin du code, mais qui s'affiche généralement lorsque vous essayez de
free()
de la mémoire à partir d'un pointeur qui n'est pas attribuée. Cela se produit souvent lorsque vous êtes à la double libération.Si vous essayez d'allouer de l'espace pour un tableau de pointeurs, comme
ensuite, vous devrez tenir compte de la taille de mot (8 octets dans un système 64 bits, 4 octets dans un système 32-bits) lors de l'attribution de l'espace de n pointeurs. La taille d'un pointeur est le même que votre mot de taille.
Ainsi, alors que vous pouvez allouer de l'espace pour n pointeurs, vous allez réellement besoin de n fois 8 ou 4 (pour la version 64-bits ou 32-bits des systèmes, respectivement)
Pour éviter un débordement de votre mémoire allouée pour les n éléments de 8 octets:
Cela renvoie un bloc de n pointeurs, chacun composé de 8 octets (ou 4 octets si vous utilisez un système 32 bits)
J'ai remarqué que Linux va vous permettre d'utiliser tous n pointeurs lorsque vous n'avez pas compensée par taille de mot, mais lorsque vous essayez de libérer de la mémoire, il se rend compte de son erreur et il donne plutôt méchant erreur. Et c'est un mauvais, quand vous débordement de la mémoire allouée, de nombreux problèmes de sécurité attendent.
sizeof(char*)
.sizeof
de l'opérateur lors de l'utilisation de malloc est vraiment juste des ennuis. IIRC la norme garantit la taille d'un char, mais à peu près n'importe quoi d'autre est à l'ISA, si vous êtes vraiment le meilleur off à l'aide desizeof
partout.J'ai rencontré une erreur similaire. C'était une erreur de débutant fait à la hâte. Tableau d'entiers sans déclarer la taille de l'int a [], puis tentez d'y accéder.
Compilateur C++ doit en ai attrapé une telle erreur facilement si elle était dans le main. Cependant, parce que ce tableau int a été déclarée à l'intérieur d'un objet, il a été créé en même temps que mon objet (de nombreux objets qui ont été en cours de création) et le compilateur a été de jeter un free(): invalid suivant la taille(normal) erreur.
J'ai pensé à 2 explications à cela (merci de m'éclairer si quelqu'un en sait plus):
1.) Cela a entraîné dans certains aléatoire de la mémoire assignée à elle, mais puisque ce n'était pas accessible, il a été de libérer tous les autres de segment de mémoire simplement en essayant de trouver ce type int.
2.) La mémoire requise par il était pratiquement infinie pour un programme, et de confier cette elle était de libérer tous les autres de la mémoire.
Simple:
Résolu le problème. Mais il a fallu beaucoup de temps à essayer de déboguer ce parce que le compilateur ne peut pas "vraiment" trouver l'erreur.
J'ai rencontré une telle situation où le code a été contourner la STL l'api et l'écriture de la matrice de mal quand quelqu'un la redimensionne. L'ajout de l'affirmer ici pris: