2

在我的应用程序中实现 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 < fm. 我现在不明白的是,这种情况从何而来。我在代码中的任何地方都找不到任何可以保证 fm <= m 的东西。然而,“选择没有被破坏”:我怀疑它真的是 nedmalloc 中的一个错误,很可能我在某处做错了什么,但我找不到它。一旦我打开 nedmalloc 的调试功能,问题就消失了。

如果这里有人了解 nedmalloc 的内部工作,您能否向我解释为什么 fm <= mem 有保证?

4

2 回答 2

1

我假设这SIZE_T_BITSIZE是类型中的位数size_t,所以将 1 移动SIZE_T_BITSIZE - 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_MAX1为正值。将该值转换为int可能溢出,这是实现定义的,或者可能不会溢出,在这种情况下,您最终会得到一个正值。

因此,要回答您的问题,如果(size_t)mem小于(size_t)fm,您可能在此之前有一个错误。

是什么m?通过m,你的意思是mem

编辑nedmalloc:由于我上面提到的原因,看起来像一个错误。有问题的代码已在最新版本中被注释掉

于 2010-03-25T16:26:36.080 回答
1

我现在可以看到这一行添加了一条注释 /* 查看内存是否低于内存 */ 并且在 beta svn1159 中使用 #if 0 禁用了它。条件不成熟,可能是错误的(它仍然留在代码的 Linux 特定部分 - 很可能在那里也有错误?)

经验教训:“测试版选择可能会被破坏”。

于 2010-03-25T19:36:33.367 回答