Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的malloc错误+;_C++_Malloc - Fatal编程技术网

C++ c+中的malloc错误+;

C++ c+中的malloc错误+;,c++,malloc,C++,Malloc,嗨,当我试图执行我的程序(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)

嗨,当我试图执行我的程序(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's追踪我的程序时,我发现,这是因为下面这行代码

BNode* newNode=new BNode();
如果我删除这一行,我就不会得到错误


请任何人在这方面提供帮助。

显示的代码行一般都可以。堆以前可能已损坏。我会使用一个内存检查器来查找位置

如果没有内存检查工具,您只需仔细查看代码并找到错误

有时二进制搜索策略会有所帮助。故意停用部分代码并缩小范围。不要被你贴的那句话那样的误报所愚弄


另一种选择是切换到具有自动内存管理功能的编程语言。

显示的代码行通常是正常的。堆以前可能已损坏。我会使用一个内存检查器来查找位置

如果没有内存检查工具,您只需仔细查看代码并找到错误

有时二进制搜索策略会有所帮助。故意停用部分代码并缩小范围。不要被你贴的那句话那样的误报所愚弄


另一种选择是切换到具有自动内存管理的编程语言。

错误消息意味着程序堆的完整性受到了侵犯。堆破了。你删除的线路。。。也许是罪魁祸首,也许不是罪魁祸首。可能堆在那之前被一些代码损坏了(甚至在那之前很久),而您删除的
new
只是揭示了问题,而不是导致问题的原因。从你发布的内容中无法得知


所以,有可能通过删除该行实际上什么都没有改变。错误可能仍然存在,程序将在其他地方失败。缓冲区溢出、双重空闲或类似的情况通常是无效堆的罪魁祸首。通过一些静态或动态检查器运行代码以查找这些问题(valgrind、coverity等)

错误消息表示程序堆的完整性受到了侵犯。堆破了。你删除的线路。。。也许是罪魁祸首,也许不是罪魁祸首。可能堆在那之前被一些代码损坏了(甚至在那之前很久),而您删除的
new
只是揭示了问题,而不是导致问题的原因。从你发布的内容中无法得知


所以,有可能通过删除该行实际上什么都没有改变。错误可能仍然存在,程序将在其他地方失败。缓冲区溢出、双重空闲或类似的情况通常是无效堆的罪魁祸首。通过一些静态或动态检查程序运行代码以查找这些问题(valgrind、coverity等)

我可以知道出现此错误的原因,以及是否有其他方法可以在不使用此类工具的情况下删除此错误。@siri:这是由于某些东西损坏了malloc用于跟踪内存分配的数据造成的。最可能的原因是写入超出已分配块的边界,以及在释放块后写入块。如果没有内存检查器,这些错误可能很难跟踪;我强烈建议你用一个。在C++中,避免第二个错误的最好方法是不要自己管理内存;始终使用智能指针、容器和其他管理对象。请告诉我出现此错误的原因,以及是否有其他方法可以在不使用此类工具的情况下删除此错误。@siri:这是由于malloc用于跟踪内存分配的数据被破坏所致。最可能的原因是写入超出已分配块的边界,以及在释放块后写入块。如果没有内存检查器,这些错误可能很难跟踪;我强烈建议你用一个。在C++中,避免第二个错误的最好方法是不要自己管理内存;始终使用智能指针、容器和其他管理对象。执行直接内存管理是危险的。学习使用智能指针和编写异常安全对象(这至少会减少问题)。直接管理内存是危险的。学习使用智能指针和编写异常安全对象(这至少会减少问题)。