【发布时间】:2021-08-23 02:25:54
【问题描述】:
我有一个自定义数据结构,它本质上是一个循环链表。结束节点指向起始节点,起始节点指向列表中的第一个节点。该列表按预期完美运行,我只是不太确定以下代码的行为方式为何:
List::~List()
{
Node* p = end->next;
end->next = NULL;
while (p != NULL)
{
Node* tmp = p;
p = p->next;
delete tmp;
}
}
在解构器中,我将当前指针 (p) 设置为 end->next,正如我所说,它指向指向第一个数据节点的 start。然后我将end->next 设置为null,我认为这意味着现在开始指向任何内容。但是当它执行下一行while (p != NULL) 时,它的计算结果为真。这是为什么呢?
【问题讨论】:
-
您将
end->next设置为空,但p不为空。p是任何end->next在您将其设置为空之前。如果您希望将end->next、Node **p = &(end->next)的值作为别名,则需要p成为Node**,然后当您执行(*p) != NULL时,您将跟随p指针返回准确的end->next,如果end->next发生了变化,*p将能够看到更新后的值。 -
@ggorlen 好吧,我明白了。我将指针分配与常规分配混为一谈。感谢您的复习!
-
顺便说一句,你应该在 C++ 中使用
nullptr而不是NULL -
另外,在命名法上 - 您正在使用的函数是 析构函数,而不是“解构函数”。
标签: c++ pointers linked-list