List的析构函数无法删除最后一个节点

时间:2014-04-10 20:49:57

标签: c++ list nodes destructor

这是我的测试代码:

#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的两个析构函数。我认为这个可以工作,但out表明最后一个节点无法删除。我还测试其他数量的节点。结果相同,最后一个节点无法删除。非常感谢您的建议: - )。

1 个答案:

答案 0 :(得分:3)

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

析构函数 被调用,但是,在您的上一个节点next上是NULL,因此if语句返回false并且cout line没有被调用。

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