析构函数中无意的递归调用

时间:2010-01-18 15:57:05

标签: c++

我创建了一个包含链表的类,这个类需要有一个用于删除链表的析构函数,但是因为delete方法本身调用了析构函数,所以我最终会进行无限递归调用。

以下是代码: -

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;
    }
}

注意我尝试使用递归调用 - 有意删除链表但我仍然遇到同样的问题。

非常感谢任何帮助。

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

3 个答案:

答案 0 :(得分:11)

假设link是指向下一个PolynomialNode的指针,只需

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

会递归地做正确的事。

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

答案 1 :(得分:2)

在删除之前在while循环中添加此行:

if ( current_node_ptr == this ) continue;

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

注意:这是错误的,除非你有一个循环链接,如果这是一个有效的设计,只要你跳过删除this

答案 2 :(得分:1)

假设link是指向下一个多项式节点的指针,请简化

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