我创建了一个包含链表的类,这个类需要有一个用于删除链表的析构函数,但是因为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;
}
}
注意我尝试使用递归调用 - 有意删除链表但我仍然遇到同样的问题。
非常感谢任何帮助。
注意:我知道这是一个递归调用,因为当我单步执行调试器时,我可以看到它正在发生。
答案 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;