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

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 的声誉,但请点赞。谢谢! 哦,我知道了,这不是问题,我只是想分享一下,谢谢:)

以上是关于我可以在其析构函数中遍历带有头节点的链表吗?的主要内容,如果未能解决你的问题,请参考以下文章

基类的析构函数写成virtual虚析构函数

C++中基类的析构函数为什么要用virtual虚析构函数

有序的双链表的实现

从 C++ 中的析构函数中恢复对象?

C++ 虚拟析构函数 (virtual destructor)

20170529