ошибка malloc в c ++ - PullRequest
       4

ошибка malloc в c ++

1 голос
/ 05 октября 2010

Привет, когда я пытался выполнить свою программу (c ++), я получал следующую ошибку:

a.out: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted

и когда я отследил свою программу, используя cout, я обнаружил, что это из-за следующей строки

BNode* newNode=new BNode();

Если я удаляю эту строку, я не получаю сообщение об ошибке.

Может ли кто-нибудь, пожалуйста, помочь в этом отношении ...

Ответы [ 2 ]

3 голосов
/ 05 октября 2010

Показанная строка кода в целом в порядке. Куча, вероятно, была повреждена раньше. Я бы использовал проверку памяти, например valgrind , чтобы выяснить, где.

Без инструмента проверки памяти вам просто нужно внимательно посмотреть на ваш код и найти ошибку.

Иногда помогает стратегия двоичного поиска. Умышленно деактивируйте части вашего кода и сузьте. Не дайте себя обмануть ложными срабатываниями, такими как опубликованная вами строка.

Другой альтернативой является переключение на язык программирования с автоматическим управлением памятью.

1 голос
/ 05 октября 2010

Сообщение об ошибке означает, что целостность кучи программы была нарушена. Куча была сломана. Линия, которую вы удалили ... возможно, это был виновник, может быть, это не вина. Возможно, куча была повреждена каким-то кодом до этого (или даже задолго до этого), а удаленный вами new просто выявил проблему, а не вызвал ее. Из того, что вы опубликовали, невозможно сказать.

Так что, возможно, вы фактически ничего не изменили, удалив эту строку. Ошибка все еще может быть, и программа просто потерпит неудачу в каком-то другом месте. Переполнение буфера, двойное освобождение или что-то в этом роде, как правило, виновно в поврежденной куче. Запустите ваш код через статическую или динамическую проверку, чтобы найти эти проблемы (valgrind, coverity и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...