在我的应用程序中实现nedmalloc时,我经常遇到nedmalloc拒绝释放内存块的情况,声称它没有分配它。
我使用的是v1.06beta1_svn1151版本。
调试时我已经看到了一个失败的特定情况,所有其他(包括幻数)都成功了。条件是:
if((size_t)mem-(size_t)fm>=(size_t)1<<(SIZE_T_BITSIZE-1)) return 0;
在Win32上,这似乎相当于:
if((int)((size_t)mem-(size_t)fm)<0) return 0;
这似乎与:
相同if((size_t)mem<(size_t)fm) return 0;
在我的情况下,我真的看到mem&lt;调频。我现在不明白的是,这种情况来自哪里。我找不到任何可以保证代码中任何地方的fm&lt; = m的东西。然而,“选择没有被打破”:我怀疑它真的是nedmalloc中的一个错误,很可能我在某处做错了,但我找不到它。一旦我打开nedmalloc的调试功能,问题就会消失。
如果有人在这里了解nedmalloc的内部工作,你能不能向我解释为什么保证fm&lt; = mem?
答案 0 :(得分:1)
我假设SIZE_T_BITSIZE
是size_t
类型中的位数,因此将SIZE_T_BITSIZE - 1
移位1会得到(SIZE_MAX + 1) / 2
(数学)值。因此,条件是测试(size_t)mem - (size_t)fm
是否大于或等于(SIZE_MAX + 1) / 2
的数学值。
这与(int)((size_t)mem - (size_t)fm) < 0
不同。此外,如果将mem
和/或fm
强制转换为size_t
(无符号类型),则算术以无符号类型进行,这意味着差值不能小于0。即使(size_t)mem
小于(size_t)fm
,(size_t)mem - (size_t)fm
也不会小于0.它等于差mem - fm
加SIZE_MAX
加{ {1}},这是一个正值。将该值转换为1
可能会溢出,这是实现定义的,或者可能不会溢出,在这种情况下,您最终会得到正值。
因此,要回答您的问题,如果int
小于(size_t)mem
,那么之前可能会出现错误。
什么是(size_t)fm
?截至m
,您的意思是m
吗?
编辑:看起来像mem
中的错误,原因我上面提到过。相关代码为commented out in the latest version。
答案 1 :(得分:1)
我现在可以看到这行已经添加了注释/ *看看内存中的mem是否低于mem * /并且在beta svn1159中使用#if 0禁用了它。条件不成熟,可能是错误的(它仍然留在代码的Linux特定部分 - 最有可能在那里出错?)
获得的经验:“ beta 选择可以被破坏”。