C 在K&R的p188中给出的释放函数实际上释放了以前分配的内存吗?

C 在K&R的p188中给出的释放函数实际上释放了以前分配的内存吗?,c,malloc,free,C,Malloc,Free,让我们看一下给定的代码: void free(void *ap) { Header *bp, *p; bp = (Header *)ap - 1; for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; if (bp

让我们看一下给定的代码:

void free(void *ap) {
Header *bp, *p;

bp = (Header *)ap - 1;
for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
    if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
        break;
if (bp + bp->s.size == p->s.ptr) {
    bp->s.size += p->s.ptr->s.size;
    bp->s.ptr = p->s.ptr->s.ptr;
} else
    bp->s.ptr = p->s.ptr;
if (p + p->s.size == bp) {
    p->s.size += bp->s.size;
    p->s.ptr = bp->s.ptr;
} else
    p->s.ptr = bp;
freep = p;
}
据我所知,如果给定的空闲获取指向已存在内存块的指针,则此循环:

for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
    if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
        break;
将永远消失。 因为当p==ap时,对于每隔一个p,条件:!bp>p&&bps.ptr将为真 条件p>=p->s.ptr&&bp>p|bps.ptr将为false

编辑: 完整的代码可以在这里看到:

由于freep顾名思义是一个空闲列表,ap是一个分配的chuck,因此它不在空闲列表中,因此p==ap不应该是真的。 如果满足以下条件之一,则循环结束:

要释放的区块位于具有更高地址循环条件的当前和下一个空闲列表元素之间; 要释放的块位于空闲列表的最高地址末尾,即空闲列表包装的位置。如果条件允许。
标题是什么?什么是免费的?s是什么?顺便说一句:我不确定从一本30年前的书中学习C是否真的是个好主意。@MichaelWalz:我知道。依我看,这仍然是对C语言最好的解释。事实上,您应该继续深入研究。分配器假设以前分配的块将来可能有用是很正常的。所以不,它不会释放内存,它使它可以用于将来的malloc调用。更复杂的分配器将与操作系统合作,释放地址空间,通常在有足够的连续空间再次可用时,但是依赖于操作系统的实现肯定不是代码的重点。因此,实际上你同意我的观点,当ap在空闲列表中时,给定的空闲函数不会释放分配的内存?。我问这个问题是因为free函数的名称有误导性。该函数不释放分配的内存。已分配内存是不在空闲列表中的内存。当您试图释放已在可用列表中的内存时,您会遇到麻烦。