free 一段内存时, 提示 ASSERT (mem->used == 0)
失败, 看源码是因为刚把 mem->used
置零以后, 又不知道被哪里置1,
通过在rt_free plug_holes(mem);
之前加了 while(i++ < 100)
, 更容易捕捉到这种修改, 发现是malloc
对其进行的修改,
不明白free
刚设置 mem->used = 0
,之后, 为什么malloc
还能继续操作这部分数据, 不是有sem
吗?
感谢能解答,谢谢
重复释放我检查了, 不会有个这情况, 内存写穿是什么概念?产生这种情况的原因是什么?谢谢
申请 10字节,实际写了20字节,自然就把其它数据就给写错了。
heap结构
@aozima 我也怀疑了这种情况, 如果是写穿, 控制块 mem->used 应该是一个变化的值, 但是每次都是1, 我搜索了一下源码, 发现只有malloc会对他赋值, 我尝试做了个修改, 在rt_free 函数调用plug_holes(mem)之前, 加了个mem->used = 2; while(i++ < 100); mem->used = 0; malloc 会捕获到 mem->used =2 的情况, 感觉不像是多写了造成的, 谢谢
我尝试修改的如上图
跟踪下heap_sem的值,看看在哪里被改变了
@JQRR_7669 能描述一下如何操作吗?
@JQRR_7669 我也怀疑sem被修改了, 于是自己又加了一个mutex, 每次掉用free 和 malloc之前都保护一下, 好像没什么效果, 和之前一样