我有一个复杂的程序,它使用Java代码作为UI,并使用C / C ++代码作为模拟器后端。 Java代码通过JNI调用C代码。
现在,我收到了这个错误:
java(14611,0x11dd8e000) malloc: *** error for object 0x7fb95c1b4e08: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
我知道我的代码中存在某种内存问题,但我的问题是:
malloc 如何知道内存在被释放后被修改了?它可以检测到这一点是做什么的?是否在解除分配之前创建了内存校验和,然后保存该校验和并验证在下次分配期间内存是否未发生变化?
特别是,我设置了建议的断点,并且在内存释放时发生了上述错误。因此,如果我上面关于事情如何运作的假设是正确的,那么为什么这种检测会在解除分配时发生?
答案 0 :(得分:0)
通常,malloc实现在返回给调用者的地址前面分配一个头。有时它们也有一个用于检测超支的预告片。
听起来你的free()正在块上运行某种校验和,然后将该值存储在标题中。
您的malloc实现正在检查块,重新计算校验和,并查找数据已被修改。
很可能malloc正在尝试重用已经分配和释放一次的块。 malloc不太可能扫描所有释放的块。