C ++困扰析构函数

时间:2011-11-06 14:21:47

标签: c++ memory-leaks memory-management destructor

这是一项学校作业,我的大部分内容都得到了控制,但是有一小部分内容正在造成内存泄漏,我对如何修复它没有更多的想法。

我们已经创建了一个内存分配器,故障部分是这两个功能。

第一个无法修改

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。

我希望这不是一个太愚蠢的问题。

非常感谢!

尼科

1 个答案:

答案 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
}