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