我遇到了崩溃,信号6在新操作符上中止,并带有以下callstack:
> #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 .............
我可以最终得到这个的可能原因是什么?我的机器的内存使用率很低,大约是12GB的8%,我不认为内存是个问题(核心转储大约是700MB)。
重载new运算符以使用malloc:
void * operator new (size_t size) throw()
{
return malloc(size);
}
答案 0 :(得分:4)
你很可能早先超越了一个新的&malloc&#c; ed块,破坏了malloc使用的簿记数据,因此下次你尝试使用malloc时会崩溃。
答案 1 :(得分:2)
您应编译所有警告和调试信息(例如g++ -Wall -g
),然后使用valgrind。
您对new
的实施是错误的。 malloc
可能会失败,在这种情况下,您的new
应该抛出异常。不允许退回NULL
如果您的GCC是最近的,请考虑使用-fsanitize=address