【问题标题】:unintentional recursive call in destructor析构函数中的无意递归调用
【发布时间】:2010-01-18 15:57:04
【问题描述】:

我创建了一个包含链表的类,并且该类需要具有用于删除链表的析构函数,但是我已将其包含在内,因为删除方法本身调用了析构函数,我最终陷入无限递归调用情况。

这里是代码:-

PolynomialNode::~PolynomialNode()
{
    /*PolynomialNode* current_node_ptr = link;
    PolynomialNode* header_ptr = link;
    int index = 0;
    if( link != NULL)
    {
        while( current_node_ptr != NULL)
        {
            index++;
            current_node_ptr = current_node_ptr->get_link();

        }

        delete_nodes( &header_ptr, 0, index);
    } */
    PolynomialNode* current_node_ptr = link;
    PolynomialNode* copy_ptr;
    while( current_node_ptr != NULL)

    {
        copy_ptr = current_node_ptr->get_link();
        current_node_ptr->set_link(NULL);
        delete current_node_ptr;
        current_node_ptr = copy_ptr;
    }
}

请注意,我通过递归调用尝试了此操作 - 有意删除链接列表,但我仍然遇到同样的问题。

任何帮助将不胜感激。

注意:我知道这是一个递归调用,因为当我单步调试调试器时,我可以看到它正在发生。

【问题讨论】:

  • 我不明白这将如何产生无限递归 - 只要 set_link 照它说的做,每个递归析构函数调用都应该返回而不进一步递归。
  • 当您尝试删除指向链表的指针时,即在删除命令之后,会发生递归调用 - 不,我认为这也不会以递归方式结束,但是当我使用调试器时可以清楚地看到它的发生。
  • 另外因为我已经设置了current_node_ptr来链接所以没有删除这个。

标签: c++


【解决方案1】:

假设link 是指向下一个PolynomialNode 的指针,简单地说

PolynomialNode::~PolynomialNode()
{
    delete link;
}

将递归地做正确的事情。

但是,更好的解决方案可能是保留您的 while() 循环,但将其从节点移到表示整个链表的单独类的析构函数中。

【讨论】:

  • 甚至使用 std::list(或 std::vector,因为 std::list 很少是更好的选择)...
  • 如果它是一个循环列表,你会做一个壮观的爆炸。此外,如果它的节点数超过了编译器的最大递归深度,那么您将有另一个壮观的爆炸:P
  • 不,它不是一个循环列表,我认为它应该是递归的,因为它最多只有 3/4 个节点。
  • 使用 std::list 或 std::vector 的唯一问题是我正试图从一本书中做一些关于 C++ 的练习——这部分是关于链表的——加上书中指定我应该使用链表,即我自己创建的链表。
  • 如果循环是循环的,那肯定会失败。原始问题似乎暗示了他的代码。
【解决方案2】:

在while循环中添加这一行,在删除之前:

if ( current_node_ptr == this ) continue;

这将允许您通过跳过正在调用的节点的破坏来避免递归。但是,您应该首先问自己为什么会发生这种情况。我无法回答这个问题,因为我没有看到其余的代码。

注意:这是错误的,除非你有一个循环链接,在这种情况下这将是一个有效的设计,只要你跳过删除this

【讨论】:

  • @Skurmedel, @Dewfy :大声笑,这来自于在处理 Pascal 代码 xD 时回答 C++ 问题,谢谢!
【解决方案3】:

假设链接是指向下一个PolynomialNode的指针,简单

if(this->link != NULL) delete this->link;

【讨论】:

  • 是的,这与 Moonshadow 的方法基本相同,所以谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2016-03-13
  • 2021-07-31
  • 2012-02-03
  • 2016-10-24
  • 2015-07-01
  • 2017-06-12
相关资源
最近更新 更多