【问题标题】:Destructor of List cannot delete the last nodeList的析构函数不能删除最后一个节点
【发布时间】:2014-04-10 20:49:56
【问题描述】:

这是我的测试代码:

#include <iostream>
#include <cstdlib>

using namespace std;

class List
{
    private:
        class Node{
            public:
                int data;
                Node* next;
            public:
                virtual ~Node()
                {
                    if (next != NULL)
                    {
                        cout << "Node is out: " << data << endl;
                        delete next;
                    }
                }
                Node()
                {
                    next = NULL;
                }
        };

        Node* head;
    public:
        virtual ~List()
        {
            if (head != NULL)
            {
                delete head;
            }
        }
        List()
        {
            head = NULL;
        }
    public:
        void AddNode(int data);
        void DeleteNode(int data);
        //....  
};

void List::AddNode(int data)
{
    Node* temp = new Node;
    temp -> data = data;

    if (head == NULL)
    {
        head = temp;
    }
    else
    {
        Node* ptr = head;
        while (ptr -> next != NULL)
        {
            ptr = ptr -> next;
        }
        ptr -> next = temp;
    }   

}

int main()
{
    List test_list;
    test_list.AddNode(1);
    test_list.AddNode(2);
    test_list.AddNode(3);
    test_list.AddNode(4);
    test_list.AddNode(5);

    return 0;   
}

输出是这样的:

Node is out: 1
Node is out: 2
Node is out: 3
Node is out: 4

它是一个普通的列表,你可以注意Node和List的两个析构函数。我认为这个可以工作,但结果表明最后一个节点不能被删除。我还测试了其他数量的节点。结果是一样的,不能删除最后一个节点。提前感谢您的建议:-)。

【问题讨论】:

  • 我不会为 Node.js 编写析构函数。让列表处理销毁节点。 Node 拥有虚函数也没有意义。
  • @PaulMcKenzie 为什么没有 Node 的析构函数?我认为这是个好主意。特别是当我实现一棵树时,我只能删除根节点,所有节点都会删除它们的子节点。
  • 对于一个单向链表,让节点删除下一个是矫枉过正的,如果你在这个列表上展开的话,这是一种容易让自己陷入麻烦的简单方法。 List 类确切地知道节点是如何布局的——它只需要一个简单的循环。
  • 如果 Node 没有析构函数,再次让 List 遍历节点列表:virtual ~List(){ Node* pHead = head; while (pHead) { Node* temp = pHead; delete pHead; pHead = temp-&gt;next; } head = NULL; } 另外,如果我想删除单个节点怎么办?如果您删除当前节点,您的析构函数将如何确定“下一个”是要删除的?
  • @PaulMcKenzie 是的,你是对的。在这种情况下,删除特定节点非常不方便。

标签: c++ list nodes destructor


【解决方案1】:

将您的析构函数更改为在 if 语句的外部打印。

析构函数正在被调用,但是,在您的最后一个节点next 上是NULL,所以if 语句返回false 并且cout 行没有被调用。

virtual ~Node()
{
    cout << "Node is out: " << data << endl;                
    if (next != NULL)
    {        
        delete next;
    }
}

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 1970-01-01
    • 2013-03-25
    • 2014-05-22
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多