[英]Does free function given in p188 at K&R actually free memory that was allocated before?
让我们看下面的给定代码:
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 <p-> s.ptr)为真,而条件p> = p-> s.ptr &&(bp> p | | bp <p-> s.ptr)将为false。
编辑:完整代码可以在这里看到: 从K&R书中解释malloc的实现
由于freep
是自由列表(顾名思义)并且是ap
分配的卡盘(因此不在自由列表中),因此p==ap
不应为真。 满足以下条件之一的循环结束:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.