当我尝试执行我的程序(c ++)时,我收到了以下错误:
a.out: 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.
Aborted
当我使用cout跟踪我的程序时,我发现,这是因为以下行
BNode* newNode=new BNode();
如果我删除此行,我没有收到错误。
任何人都可以帮助这方面......
答案 0 :(得分:3)
显示的代码行通常是正常的。堆之前可能已经损坏了。我会使用像valgrind这样的内存检查器来查找位置。
如果没有内存检查工具,您只需要仔细查看代码并找到错误。
有时二元搜索策略会有所帮助。故意停用部分代码并缩小范围。不要被你发布的那些误报所愚弄。
另一种选择是切换到具有自动内存管理的编程语言。
答案 1 :(得分:1)
错误消息表示违反了程序堆的完整性。堆坏了。你删除的那条线......也许是罪魁祸首,也许这不是罪魁祸首。在此之前(甚至在此之前),某些代码可能会损坏堆,并且您删除的new
只是显示问题,而不是导致问题。你发布的内容无法说出来。
因此,您可能通过删除该行实际上没有改变任何内容。错误可能仍然存在,程序将在其他地方失败。缓冲区溢出,双重释放或类似的东西通常是无效堆的责任。通过一些静态或动态检查器运行代码来查找这些问题(valgrind,coverity等)