【发布时间】:2016-03-19 01:22:34
【问题描述】:
我很好奇指针和删除指针在 C++ 中是如何工作的,所以我做了一个实验。我制作了一个非常简单的单链表和以下递归函数,用于删除列表中的所有节点:
void deleteList(Node *node) {
if (!node)
return;
deleteList(node->next);
cout << "deleting node " << node->data << endl;
delete node;
node = nullptr;
}
我想这会成功删除列表中的所有节点。但是,在main中调用了这个函数后,我检查了头节点是否仍然存在:
List list;
// appending a bunch of numbers to the list...
list.deleteList(list.head);
if (list.head)
cout << true;
这将在控制台打印 1,这意味着头部确实仍然存在。我希望头部和它之后的所有其他节点都为空,因此 if 条件失败,因为将指针设置为空是我在递归函数中做的最后一件事。那么为什么程序会报告头部仍然存在呢?
编辑:更改列表列表();列出列表;
【问题讨论】:
-
List list();不是你想的那样。 Most Vexing Parse -
是的,我的实验中实际上有两个构造函数。上面示例中的一个调用另一个构造函数,该构造函数初始化诸如 0 的大小值和一个新的空头节点。
-
该语句根本不调用构造函数。它是一个函数
list的声明,它的返回类型是List。对于对象初始化,()需要被移除。 -
哦,你说得对。一时间不知道我在想什么