我可以在析构函数中遍历链表的头节点吗?

Can I traverse a linked list with its head node in its destructor?

这似乎是一个愚蠢的问题,但我问的原因是因为我有这个析构函数:

list::~list()
{
    for (node* next = headByName->nextByName; headByName; headByName = next)
    {
        delete headByName;
    }
}

而且 valgrind 仍然说我有内存泄漏。所以我想我真正的问题是:是我的析构函数编码错误,还是通过遍历列表的头节点来销毁列表是不好的?

您的代码没有做正确的事情。

  1. 您永远不会更改 next,因此 headByName 在第一次迭代后不会更改。
  2. 如果 headByName 在循环开始之前是 nullptr,则在初始化时取消引用 nullptr。

试试这个:

list::~list()
{
    while (headByName)
    {
      node* next = headByName->nextByName;
      delete headByName;
      headByName = next;
    }
}

既然你评论了 for 循环的偏好,作为 for 的粉丝,我尽可能地使用它,我想写下如何用 for 循环实现这一点:

for(node* next; headByName; headByName = next)
{   next = headByName->nextByName;
    delete headByName;
}