这是否会导致使用链接列表导致内存泄漏?

时间:2017-04-23 13:20:57

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

我正在为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();

2 个答案:

答案 0 :(得分:3)

如果你这样做

T object = list.front();

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

另一方面,如果你写了

const T& ref = list.front();

然后调用list.pop()会使ref成为悬空引用,这与内存泄漏不同。

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

T& object = list.front();

无法编译,因为无法从const引用构建非const引用。

答案 1 :(得分: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()之后它会悬空。