我可以在其析构函数中遍历带有头节点的链表吗?
Posted
技术标签:
【中文标题】我可以在其析构函数中遍历带有头节点的链表吗?【英文标题】:Can I traverse a linked list with its head node in its destructor? 【发布时间】:2016-01-08 01:31:40 【问题描述】:这似乎是一个愚蠢的问题,但我问的原因是因为我有这个析构函数:
list::~list()
for (node* next = headByName->nextByName; headByName; headByName = next)
delete headByName;
而且 valgrind 仍然说我有内存泄漏。所以我想我真正的问题是:我的析构函数编码错误,还是用头节点遍历列表来破坏列表是不好的?
【问题讨论】:
那个密码被破解了! @CaptainObvlious XD 我想我明白你为什么有这么多声望了。 您在查看什么用户资料?我有杰克的声誉。 @CaptainObvlious 你的。 14,273 声望对你来说不算什么吗? 【参考方案1】:您的代码没有做正确的事情。
-
您永远不会更改
next
,因此headByName
在第一次迭代后不会更改。
如果在循环开始之前 headByName 为 nullptr
,则在初始化中取消引用 nullptr。
试试这个:
list::~list()
while (headByName)
node* next = headByName->nextByName;
delete headByName;
headByName = next;
【讨论】:
有人告诉我尽可能使用for
循环。我想这不是 for
循环的地方。【参考方案2】:
既然您评论了 for 循环的偏好,作为 for 的粉丝并且我尽可能使用它,我想写下如何使用 for 循环来实现这一点:
for(node* next; headByName; headByName = next)
next = headByName->nextByName;
delete headByName;
【讨论】:
这会比@ronalchn 的 while 循环效率低吗? @Larrimus 在性能方面相同,语句顺序相同,但编写方式不同。我喜欢使用 for 循环,因为它们使代码更短。上面的代码甚至可以用for完全写一行,但我不想写“不熟悉”和可能不推荐的东西:) 很抱歉,我无法通过将您的解决方案标记为正确答案来为您提供 +15 的声誉,但请点赞。谢谢! 哦,我知道了,这不是问题,我只是想分享一下,谢谢:)以上是关于我可以在其析构函数中遍历带有头节点的链表吗?的主要内容,如果未能解决你的问题,请参考以下文章