【发布时间】: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->next; } head = NULL; }另外,如果我想删除单个节点怎么办?如果您删除当前节点,您的析构函数将如何确定“下一个”是不要删除的? -
@PaulMcKenzie 是的,你是对的。在这种情况下,删除特定节点非常不方便。
标签: c++ list nodes destructor