新的操作员崩溃

时间:2014-08-11 15:59:02

标签: c++ linux gcc

我遇到了崩溃,信号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);
}

2 个答案:

答案 0 :(得分:4)

你很可能早先超越了一个新的&malloc&#c; ed块,破坏了malloc使用的簿记数据,因此下次你尝试使用malloc时会崩溃。

答案 1 :(得分:2)

您应编译所有警告和调试信息(例如g++ -Wall -g),然后使用valgrind

您对new的实施是错误的。 malloc可能会失败,在这种情况下,您的new应该抛出异常。不允许退回NULL

如果您的GCC是最近的,请考虑使用-fsanitize=address