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

C++ 析构函数中的无意递归调用,c++,C++,我已经创建了一个包含链表的类,这个类需要一个用于删除链表的析构函数,但是我已经包含了这个析构函数,因为delete方法本身调用析构函数,我最终在一个无限递归调用场景中结束 代码如下:- PolynomialNode::~PolynomialNode() { /*PolynomialNode* current_node_ptr = link; PolynomialNode* header_ptr = link; int index = 0; if( link !=

我已经创建了一个包含链表的类,这个类需要一个用于删除链表的析构函数,但是我已经包含了这个析构函数,因为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;
    }
}
注意,我尝试了一个递归调用来删除链表,但仍然存在同样的问题

任何帮助都将不胜感激


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

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

if ( current_node_ptr == this ) continue;
这将允许您通过跳过正在调用的节点的销毁来避免递归。然而,你应该问问自己,为什么会发生这种事情。我无法回答这个问题,因为我看不到代码的其余部分


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

,假设
链接
是指向下一个
多项式节点的指针

PolynomialNode::~PolynomialNode()
{
    delete link;
}
将递归地做正确的事情


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

假设link是指向下一个多项式节点的指针,只需

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

“Skurmedel,”DWFY:LOL,这是在处理PASCAL代码XD时回答C++问题,谢谢!相关:我不知道这将如何给出无限递归-只要
set\u link
按照它所说的做,每个递归析构函数调用都应该返回,不再递归。当您尝试删除指向链接列表的指针时,即在执行delete命令之后,就会发生递归调用-不,我也不认为这会以递归结束,但当我使用调试器时,您可以清楚地看到它正在发生。另外,因为我已经设置了当前的_node_ptr要链接,不需要删除它。甚至可以使用std::list(或者std::vector,因为std::list很少是更好的选项)…如果它是一个循环列表,你会做出惊人的放大。也,如果它比编译器的最大递归深度要多,那么你就有了另一个壮举:PNO,它不是循环列表,我认为它应该是递归的明智的,因为它只有3/4个节点在max。使用STD的唯一问题是:列表或STD::vector是我试图从一本书上做一些C++练习。链表——加上这本书规定我应该使用链表,即我自己创建的链表。如果循环是循环的,那肯定会失败。原来的问题在他的代码中似乎暗示了这一点。是的,这基本上与Moonshadow的方法相同,所以谢谢。