malloc: Ungültiger Zeiger aus der Warteschlange entfernt von der freien Liste

Habe ich einige C++ - code in meinem OS-X-Projekt, weist ein array folgendermassen:

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

Diese wird in eine Vorlage-Klasse; C ist unsigned short. lengthHint 1 ist. Das ist alles irrelevant. Den Fehler bekomme ich zur Laufzeit:

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

Scheint es malloc ist Versagen, weil Sie einen vorherigen Aufruf free befreit, etwas, das nicht gültig ist. Aber es scheint, wie free habe, beschwerten sich darüber, dass zu der Zeit.

Offensichtlich gibt es Millionen von malloc/free und new/delete Anrufe ausgeführt wird und dieser code läuft ohne Probleme in anderen Programmen, die auf iOS und OS X. ich bin mir nicht sicher, wie Sie dabei Vorgehen debugging und bin auf der Suche nach Anregungen.

In jedem Fall, es sieht aus wie valgrind läuft auf OS X, damit würde ich anfangen.
set a breakpoint in malloc_error_break to debug Gut hast du das gemacht? Ich glaube nicht, verwenden Sie XCode, aber wenn dies ist, was es sagt, zu tun, ich denke, Sie sollten versuchen und tun dies. Dann noch einen Blick auf den call-stack.
@Mike Seymour erwähnt valgrind ist wahrscheinlich die beste Antwort auf suchen dieses problem. Sie können jedoch völlig verhindern solche Probleme ganz einfach durch nicht zu tun, manual memory management (smart Pointer und die richtige Container).
Paul, der Fehler wird ausgelöst, in malloc, so brechen bei malloc_error_break produziert die gleichen call Stacks wie ich war zu sehen, das ist, wo ich bekam die code-Zeile reproduziert in der Frage.
Daneben, völlig umschreiben, die das Programm zur Verwendung der smart-Pointer ist wie darauf hindeutet, dass ich fix die Kuppel Licht in meinem Auto durch ein Fahrrad zu fahren. Es ist nichts falsch mit dem Fahrrad, aber die Frage war über die Festsetzung des Lichts. Die Programmierer implementieren intelligente Zeiger sind mit dem guten, alten memory management unter der Haube, damit Fehler nicht vermieden, Sie einfach verschieben. Dieser code ist schon seit 16 Jahren und läuft über ein halbes Dutzend Plattformen. Zufällig ist es in unserer Implementierung von smart Pointern, so dass Anwender von dieser besonderen Klasse nicht zu befürchten, Speicher-management. (mehr...)

InformationsquelleAutor Craig | 2014-11-11

Schreibe einen Kommentar