2012-01-12 5 views
0

FINAL_EDIT: найденная проблема, в цикле for встречный счетчик, который также использовался как индекс, был больше числа элементов массива , Странная вещь в том, что я не получал ошибку сегментации, а вместо этого ошибку, о которой я упоминал. Почему?malloc.c «sYSMALLOC: Assertion» в исполнении с проектом C++

Благодарим за помощь!
_ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _

У меня есть проект в C++, и я получаю эту ошибку (НЕ ВСЕГДА) и если определенная глобальная переменная, которая действует как размер int.

NEW EDIT_1-> Я не использовал оператора new вообще, кроме основной функции, которую я объявляю новым массивом указателей на объекты класса. Как это:

Student* test[NUM_AM]; 
for(int i=0; i<NUM_AM; i++) 
{ 
    test[i] = new Student(random_elements); 
} 

Есть ли способ, чтобы найти строку, которая вызывает это?

Ошибка это (копируется выход БГД):

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. 

Program received signal SIGABRT, Aborted. 
0x00007ffff75563a5 in __GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 
64 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 
in ../nptl/sysdeps/unix/sysv/linux/raise.c 

Также Valgrind дает следующее:

==6775== HEAP SUMMARY: 
==6775==  in use at exit: 560 bytes in 35 blocks 
==6775== total heap usage: 35 allocs, 0 frees, 560 bytes allocated 
==6775== 
==6775== LEAK SUMMARY: 
==6775== definitely lost: 560 bytes in 35 blocks 
==6775== indirectly lost: 0 bytes in 0 blocks 
==6775==  possibly lost: 0 bytes in 0 blocks 
==6775== still reachable: 0 bytes in 0 blocks 
==6775==   suppressed: 0 bytes in 0 blocks 
==6775== Rerun with --leak-check=full to see details of leaked memory 
==6775== 
==6775== For counts of detected and suppressed errors, rerun with: -v 
==6775== Use --track-origins=yes to see where uninitialised values come from 
==6775== ERROR SUMMARY: 806 errors from 2 contexts (suppressed: 4 from 4) 

Спасибо за ваше время.

NEW_EDIT2: Я побежал приложения с:

valgrind --leak-check=full --track-origins=yes ./out 
and NUM_AM = 25; 

Это выход я здесь на Pastebin: here!

NEW_EDIT3: Следует отметить, что программа создает студентов с идентификатором и присваивает им значение true/false в массиве bool и 2 переменных bool. Переменная NUM_AM используется как индекс статических массивов, объявленных как члены класса. Кроме того, NUM_AM используется в нескольких функциях при поиске их идентификатора.

С NUM_AM> 22 ошибка может произойти даже после создания 1-го ученика. С NUM_AM < = 21, я не смог воспроизвести ошибку с несколькими серийными исполнениями программы.

+0

Использование '--leak-check = full' и' track-originins = yes' ... –

+0

Разве это не говорит вам, что такое 806 ошибок и 2 контекста? –

+0

@KerrekSB: Я обновил вывод valgrind как дополнительную информацию. – Chris

ответ

1

Рад, что вы нашли источник своей ошибки. В связи с вашим окончательным вопросом

Странно, что я не получал ошибку сегментации, а вместо этого я упоминал об ошибке. Почему?

Если вы размещаете свой массив в стеке (например, ваш test является стек массив), доступ к данным за пределами массива не повышает Сегментация Fault. Вместо этого вы начинаете переопределять другие важные данные в стеке. Стек содержит:

  • Все ваши локальные переменные
  • Обратный адрес для функции (так, чтобы функция знать, куда вернуться)
  • Предыдущие указатели кадров и другие вещи, необходимые для правильного функционирования вызывающей

Обратите внимание, что некоторые или все перечисленные выше могут быть оптимизированы до некоторой степени. Дополнительная информация: http://en.wikipedia.org/wiki/Call_stack

Смежные вопросы