2014-11-11 11 views
5

Ho qualche codice C++ nel mio progetto OS X che alloca una matrice così:malloc: Invalid puntatore rimossa da lista libera

C * p = new C[lengthHint + 2]; 

Questo è in una classe template; C è unsigned short. lengthHint è 1. Questo è tutto irrilevante. L'errore che ottengo in fase di esecuzione è:

malloc: *** error for object 0x60800000c4f0: Invalid pointer dequeued from free list 
*** set a breakpoint in malloc_error_break to debug 

Sembra malloc sta fallendo perché una precedente chiamata a free liberato qualcosa che non era valido. Ma sembra che lo free si sarebbe lamentato al momento.

Ovviamente ci sono milioni di malloc/free e new/delete chiamate in corso di esecuzione e questo stesso codice viene eseguito senza problemi in altri programmi in esecuzione su iOS e OS X. Non sono sicuro come affrontare il debug questo e sto cercando suggerimenti.

+1

@ Craig: In ogni caso, sembra che [valgrind] (http://valgrind.org/) gira su OS X, quindi mi piacerebbe iniziare con quello. –

+0

@Craig - 'imposta un punto di interruzione in malloc_error_break per eseguire il debug' Beh, l'hai fatto? Non uso XCode, ma se questo è quello che dice di fare, penso che dovresti provare a farlo. Quindi dai uno sguardo allo stack delle chiamate. – PaulMcKenzie

+1

Come @Mike Seymour menziona valgrind è probabilmente la migliore risposta a * trovare * questo problema. Tuttavia è possibile * completamente * prevenire * tali problemi interamente semplicemente non facendo la gestione manuale della memoria (puntatori intelligenti e contenitori adeguati). –

risposta

4

Come sospettavo, il problema non aveva nulla a che fare con la chiamata malloc. Avevo deciso di ignorare il problema mentre lavoravo su un altro problema. Il progetto era uno in cui stavo spostando del codice precedentemente scritto in C++ per Windows su Mac. Mentre cambiare alcuni nomi di tipo ho inavvertitamente cambiato questo:

TCHAR * p = new TCHAR[(length + 1)]; 

a questo:

char * p = new char(length + 1); 

Quindi, solo un errore di battitura, ma con implicazioni piuttosto significativo.

L'ho scoperto mentre esaminavo le modifiche recenti a un file che aveva qualche altro comportamento strano. Quindi la risposta alla mia domanda iniziale era piuttosto semplice e si applica a molte altre situazioni: "Che cosa hai cambiato ultimamente?" :-)

+1

"Che cosa hai cambiato ultimamente?" :) – Aaron

0

Probabilmente non si riferisce al tuo caso, ma voleva condividere qualche bug insidioso che ho avuto con l'errore "malloc: Puntatore non valido rimosso dalla lista libera".
Per me è stato errore nel codice seguente:
int *array = malloc(len+1 * sizeof(int));
Dal momento che sono novizio in C, ho perso qui che malloc(len+1 * sizeof(int)) assume erroneamente C Precedenza degli operatori.
ovviamente deve essere:
malloc((len+1) * sizeof(int))

+0

Lascerò qui questa domanda e può fungere da confessionale per errori di battitura in C/C++. :-) – Craig