【问题标题】:Would this cause a memory leak using linked lists?这会导致使用链表的内存泄漏吗?
【发布时间】:2017-09-20 04:02:24
【问题描述】:

我正在用 C++ 编写一个用于单链表的模板,我对删除第一个节点时返回第一个节点信息的正确方法感到困惑。

我从一本书中获得了一些帮助,其中写了两种方法,一种是返回头节点的值,另一种是删除它。让我们称其为 front() 和 pop() 方法,其中 front() 返回具有“const T&”类型的值。我的一个问题是,如果我这样做:

T object = list.front();
list.pop();

这不会导致对象引用指向任何内容吗?如果我在调用 pop() 后继续使用该对象有什么问题吗?

第二个问题是,使用front()方法的正确方法是什么,两者有什么区别:

T object = list.front();
// or
T& object = list.front();
// or
const T& object = list.front();

【问题讨论】:

  • object 是一个对象,而不是对对象的引用。它没有指向。

标签: c++ list reference linked-list singly-linked-list


【解决方案1】:

如果你这样做

T object = list.front();

front() 返回T&,则object 成为列表初始元素的副本,而不是对其的引用。

另一方面,如果你写

const T& ref = list.front();

那么对list.pop() 的调用将使ref 成为悬空引用,这与内存泄漏不同。

这应该可以解释您的第一个和第三个示例之间的区别;你的第二个例子,即

T& object = list.front();

不会编译,因为非const 引用不能从const 引用构造。

【讨论】:

    【解决方案2】:

    对于T object = list.front();objectlist.front() 的副本,然后与原始元素无关。所以list.pop()对它根本没有任何影响。

    对于T& object = list.front();,您不能这样做。 const T& 不能隐式转换为 T&

    对于const T& object = list.front();,object 是对list 中元素的引用。所以在list.pop()之后会被挂掉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多