nedmalloc:mem> = fm来自哪里?

时间:2010-03-25 16:00:49

标签: c debugging memory-management winapi nedmalloc

在我的应用程序中实现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?

2 个答案:

答案 0 :(得分:1)

我假设SIZE_T_BITSIZEsize_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 - fmSIZE_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 选择可以被破坏”。