2011-01-18 10 views
61

Qual è lo strano errore che sto ottenendo? Sto compilando C++ usando g ++ su Ubuntu 10.10. Si apre casualmente quando eseguo l'eseguibile (forse 2 volte in 8 ore, con 10 compila all'ora). Tuttavia, se pulisco e ricompongo, la maggior parte delle volte va via.Errore: free(): dimensione successiva non valida (veloce):

*** 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 
+0

Un punto e virgola mancante ha causato questo errore per me. – tmnol

risposta

78

Significa che si è verificato un errore di memoria. Si potrebbe provare a free un puntatore che non è stato assegnato da malloc (o delete un oggetto che non è stato creato da new) o si può provare a free/ tale oggetto più di una volta. È possibile che si stia traboccando un buffer o in altro modo scrivendo in memoria a cui non si dovrebbe scrivere, causando il danneggiamento dell'heap.

Qualsiasi numero di errori di programmazione può causare questo problema. È necessario utilizzare un debugger, ottenere un backtrace e vedere cosa sta facendo il programma quando si verifica l'errore. Se ciò fallisce e si determina di aver danneggiato l'heap in qualche momento precedente, è possibile che si verifichino dei problemi di debugging (potrebbe non essere troppo doloroso se il progetto è abbastanza piccolo da poterlo affrontare pezzo per pezzo).

+28

Strumenti come valgrind sono molto utili quando si trova la fonte di questi tipi di errori. Assicurati di compilare con i simboli di debug. –

+4

[valgrind] (http://www.valgrind.org) ha un valore inestimabile per risolvere questi problemi. –

+2

FYI: Ho avuto questo problema dopo aver ridimensionato uno std :: vector <> e non era abbastanza grande. – Adam27X

6

Abbiamo bisogno del codice, ma di solito si apre quando si tenta di memoria free() da un puntatore che non è allocato. Questo accade spesso quando si esegue il doppio free.

12

Ho riscontrato lo stesso problema, anche se non ho effettuato alcuna allocazione di memoria dinamica nel mio programma, ma stavo accedendo all'indice di un vettore senza allocare memoria per esso. Quindi, se lo stesso caso, è meglio allocare memoria usando resize() e quindi accedere agli elementi vettoriali.

+0

Grazie mille !!! – Hitokage

0

Mi sono imbattuto in una situazione del genere in cui il codice aggirava l'API di STL e la scrittura nell'array era insignificante quando qualcuno la ridimensionava. Aggiunta dell'asser qui rilevata:

void Logo::add(const QVector3D &v, const QVector3D &n) 
{ 
GLfloat *p = m_data.data() + m_count; 
*p++ = v.x(); 
*p++ = v.y(); 
*p++ = v.z(); 
*p++ = n.x(); 
*p++ = n.y(); 
*p++ = n.z(); 
m_count += 6; 
Q_ASSERT(m_count <= m_data.size()); 
} 
1

Ho riscontrato un errore simile. Era un errore di noob fatto in fretta. Array intero senza dichiarare la dimensione int a [], quindi tentare di accedervi. Il compilatore C++ dovrebbe aver colto un tale errore facilmente se fosse in main. Tuttavia dal momento che questo particolare array int è stato dichiarato all'interno di un oggetto, è stato creato contemporaneamente al mio oggetto (molti oggetti sono stati creati) e il compilatore ha lanciato un errore (normale) free(). Ho pensato a 2 spiegazioni per questo (per favore mi illumini se qualcuno ne sa di più): 1.) Ciò ha comportato l'assegnazione di una certa memoria casuale ma poiché non era accessibile stava liberando tutta la memoria dell'heap solo provando per trovare questo int. 2.) La memoria richiesta da esso era praticamente infinita per un programma e per assegnarlo stava liberando tutta l'altra memoria.

Una semplice:

int* a; 
    class foo{ 
    foo(){ 
     for(i=0;i<n;i++) 
      a=new int[i]; 
    } 

risolto il problema. Ma ci è voluto molto tempo nel tentativo di eseguire il debug di questo perché il compilatore non poteva "veramente" trovare l'errore.

1

Se si sta tentando di allocare spazio per un array di puntatori, come

char** my_array_of_strings; // or some array of pointers such as int** or even void** 

allora sarà necessario considerare formato Word (8 byte in un sistema a 64 bit, 4 byte di 32- sistema di bit) quando si assegna lo spazio per n puntatori. La dimensione di un puntatore è la stessa della dimensione della parola.

Così, mentre si potrebbe desiderare di allocare spazio per n puntatori, in realtà si sta andando avere bisogno di n volte 8 o 4 (per i sistemi a 64-bit o 32-bit, rispettivamente)

Per evitare traboccante tua memoria allocata per n elementi di 8 byte:

my_array_of_strings = (char**) malloc(n * 8); // for 64-bit systems 
my_array_of_strings = (char**) malloc(n * 4); // for 32-bit systems 

Ciò restituirà un blocco di n puntatori, ciascuno composto da 8 byte (o 4 byte, se si sta utilizzando un sistema a 32-bit)

ho notato che Linux ti permetterà di usare tutti i puntatori n quando non hai risarcito per le dimensioni delle parole, ma quando si tenta di liberare quella memoria si realizza il suo errore e si dà quell'errore piuttosto brutto. Ed è una brutta situazione, quando si sovrascrive la memoria allocata, molti problemi di sicurezza sono in agguato.

Problemi correlati