我可以在析构函数中遍历链表的头节点吗?
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 仍然说我有内存泄漏。所以我想我真正的问题是:是我的析构函数编码错误,还是通过遍历列表的头节点来销毁列表是不好的?
您的代码没有做正确的事情。
- 您永远不会更改
next
,因此 headByName
在第一次迭代后不会更改。
- 如果 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;
}
这似乎是一个愚蠢的问题,但我问的原因是因为我有这个析构函数:
list::~list()
{
for (node* next = headByName->nextByName; headByName; headByName = next)
{
delete headByName;
}
}
而且 valgrind 仍然说我有内存泄漏。所以我想我真正的问题是:是我的析构函数编码错误,还是通过遍历列表的头节点来销毁列表是不好的?
您的代码没有做正确的事情。
- 您永远不会更改
next
,因此headByName
在第一次迭代后不会更改。 - 如果 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;
}