【问题标题】:C++ troubled destructorC++ 麻烦的析构函数
【发布时间】:2011-12-23 01:55:51
【问题描述】:

这是一项学校作业,我可以控制大部分,但有一小部分会造成内存泄漏,我对如何修复它没有更多想法。

我们已经创建了一个内存分配器,麻烦的是这两个函数。

第一个不能修改

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()。 我意识到这个函数并没有破坏第一个“this”,因为它会立即进入 f->prev,但我不知道如何让它首先破坏这个并进入 prev。

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

非常感谢!

尼哥

【问题讨论】:

  • 你提到的东西叫做析构函数——不是解构函数。
  • 你关注rule of three了吗?
  • 目前还不清楚这段代码应该做什么。 'free' 是否应该在双向链表的每个元素上调用 'destroy'?还是应该从双向链表中删除此页面?我们为什么要销毁这个页面之前的页面?
  • @DavidSchwartz free() 应该在单链表的每个元素上调用 destroy()。我们在此页面之前销毁页面的原因是因为我无法解决这个问题,这是我的问题。我怎样才能销毁此页面,然后按照销毁所有其他页面
  • 您真的是指单链表中一个条目的“免费”成员函数应该释放该列表中的每个条目? (你还有什么其他指针?你有指向列表中第一个条目的指针吗?最后一个?成员有'next'指针和'prev'指针吗?)

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


【解决方案1】:

要从单链表中删除一个元素,您必须走到该元素以在列表中找到它之前的元素。然后你必须在它周围“缝合”。像这样:

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
}

【讨论】:

  • 我用你所说的tail替换了我的指针页面,我遇到了段错误...我喜欢你的想法,它有一些可能性,但仍然不确定如何销毁最后一页和所有其他人。
  • 添加错误检查。其他一些代码可能会破坏您的列表。例如,在f = f->prev 之后,f 不可能为 NULL,除非列表已损坏。检查那个。在if (next_f == NULL) 子句中,tail 必须等于this。检查一下。
  • 我认为我的析构函数毕竟没问题,我仍然有泄漏但它可能在程序的其他部分。
猜你喜欢
  • 2013-02-09
  • 2023-03-23
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多