J'ai un souci dans une application C++ sous Linux.
J'ai ce genre d'erreurs avec gdb :
Une ligne typique qui fait ce genre d'erreurs :Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1211122768 (LWP 24151)]
0xb7d61543 in free () from /lib/tls/i686/cmov/libc.so.6
(gdb) bt
#0 0xb7d61543 in free () from /lib/tls/i686/cmov/libc.so.6
#1 0xb7d633b1 in malloc () from /lib/tls/i686/cmov/libc.so.6
#2 0xb7f124c5 in operator new () from /usr/lib/libstdc++.so.6
#3 0xb7f125fc in operator new[] () from /usr/lib/libstdc++.so.6
J'ai vérifié, les dimensions sont OK (de l'ordre d'une centaine d'octets). Le seul truc un peu "spécial" de mon appli, c'est simplement que tout s'exécute dans un nouveau thread que je crée ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part char * buffer = new char[bufLen];
Si je ne m'abuse, la mémoire par défaut pour un thread c'est 8 Mo non ? enfin bref c'est largement supérieur à 100 octets, je comprend vraiment pas pourquoi un bête new[] peut tout faire planter...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 // Create the thread int err = pthread_create(&m_pThreadRecv, NULL, threadRecvProc, this); if (err != 0) { cerr << "pthread_create() failed (error " << err << ")." << endl; return false; }
EDIT:
J'ai le même souci avec delete[] :
Je ne fais qu'un seul free, ça c'est sûr. Mais j'ai aucune idée de la nature de la "corruption", j'ai pasl'impression que ce soit un dépassement de tampon pourtant, j'écris itérativement dans le buffer et je compare à la fin l'index avec la quantité de mémoire allouée.*** glibc detected *** double free or corruption (!prev): 0x080e7588 ***
Program received signal SIGABRT, Aborted.
[Switching to Thread -1211245648 (LWP 24897)]
0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0 0xffffe410 in __kernel_vsyscall ()
#1 0xb7d089d1 in raise () from /lib/tls/i686/cmov/libc.so.6
#2 0xb7d0a2e9 in abort () from /lib/tls/i686/cmov/libc.so.6
#3 0xb7d3c70a in __fsetlocking () from /lib/tls/i686/cmov/libc.so.6
#4 0xb7d42f74 in malloc_trim () from /lib/tls/i686/cmov/libc.so.6
#5 0xb7d432ea in free () from /lib/tls/i686/cmov/libc.so.6
#6 0xb7ef2c71 in operator delete () from /usr/lib/libstdc++.so.6
#7 0xb7ef2ccc in operator delete[] () from /usr/lib/libstdc++.so.6
Partager