繁体   English   中英

K&R的p188中给出的释放功能是否实际上释放了之前分配的内存?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM