Сбой нового оператора

0

У меня произошел сбой с сигналом 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);
}
  • 0
    что ты создаешь с new ?
  • 3
    Примерно 90% всех new сбоев происходит из-за повреждения кучи, вызванного предыдущими ошибками. Насколько безопасен ваш код?
Показать ещё 1 комментарий
Теги:
gcc

2 ответа

4
Лучший ответ

Скорее всего, вы превысите блок new'd/malloc'ed раньше, уничтожив данные хранилища данных malloc, поэтому он будет в следующий раз, когда вы попытаетесь что-то сделать malloc.

2

Вы должны скомпилировать все предупреждения и информацию об отладке (например, g++ -Wall -g), а затем использовать valgrind.

Ваша реализация new неверна. malloc может выйти из строя, и в этом случае ваш new должен исключить исключение. Не разрешено возвращать NULL

Если ваш GCC является последним, рассмотрите также использование -fsanitize=address

Ещё вопросы

Сообщество Overcoder
Наверх
Меню