这是一项学校作业,我的大部分内容都得到了控制,但是有一小部分内容正在造成内存泄漏,我对如何修复它没有更多的想法。
我们已经创建了一个内存分配器,故障部分是这两个功能。
第一个无法修改
void destroy (){
free():
tot_alloc = 0; }
第二个是我正在研究的那个
void free(){
munmap(pool, PAGE_SIZE);
Page* f = this;
f = f->prev;
if (f != NULL)
f->destroy();
}
我编写了所有的free()函数,并在赋值中被要求调用destroy()。 我意识到这个功能并没有破坏第一个“这个”,因为马上会进入f-> prev但是我不知道如何让它首先破坏它并转到prev。
我希望这不是一个太愚蠢的问题。
非常感谢!
尼科
答案 0 :(得分:2)
要从单链表中删除元素,您必须走到该元素以在列表中找到它之前的元素。然后你必须“缝合”它。像这样:
void free()
{ // Note: This has no error checking!
Page *f = tail, *next_f = NULL;
while(f != this)
{ // find this node to find the node after this node
next_f = f;
f = f->prev;
}
// found it. Now, next_f is the node after this node.
// close the chain so this link can go away
if (next_f == NULL) // there is no node after us, we must be the tail
tail = prev; // the tail is now whatever node is after us
else // in the node after us, the node before it is now the node before us
next_f->prev = prev;
destroy(); // we are unlinked from the chain so can now be freed
}