У меня произошел сбой с сигналом 6, прерванным на новом операторе со следующим вызовом:
> #0 0x00f6d00b in __kernel_vsyscall ()
> #1 0x009fdbaa in ____strtoull_l_internal () from /lib/libc.so.6
> #2 0x009ff44a in ____strtof_l_internal () from /lib/libc.so.6
> #3 0x00a3bbb5 in _IO_default_pbackfail_internal () from /lib/libc.so.6
> #4 0x00a46671 in memalign () from /lib/libc.so.6
> #5 0x00a4235f in _obstack_newchunk () from /lib/libc.so.6
> #6 0x00a4334e in strverscmp () from /lib/libc.so.6
> #7 0x083d54cd in operator new (size=1160) at /home/build/exp.cpp:8145
> #8 .............
Каковы возможные причины, по которым я могу это сделать? Использование памяти в моей машине довольно низкое, около 8% от 12 ГБ, я не думаю, что проблема памяти (основная дампа - около 700 МБ).
Новый оператор перегружен для использования malloc:
void * operator new (size_t size) throw()
{
return malloc(size);
}
Скорее всего, вы превысите блок new'd/malloc'ed раньше, уничтожив данные хранилища данных malloc, поэтому он будет в следующий раз, когда вы попытаетесь что-то сделать malloc.
Вы должны скомпилировать все предупреждения и информацию об отладке (например, g++ -Wall -g
), а затем использовать valgrind.
Ваша реализация new
неверна. malloc
может выйти из строя, и в этом случае ваш new
должен исключить исключение. Не разрешено возвращать NULL
Если ваш GCC является последним, рассмотрите также использование -fsanitize=address
new
?new
сбоев происходит из-за повреждения кучи, вызванного предыдущими ошибками. Насколько безопасен ваш код?