这会导致使用链表的内存泄漏吗?
Would this cause a memory leak using linked lists?
我正在用 C++ 编写单链表模板,我对删除第一个节点时返回第一个节点信息的正确方法感到困惑。
我从一本书中得到了一些帮助,书中写了两种方法,一种是 returns 头节点的值,另一种是删除它。我们将该方法称为 front() 和 pop(),其中 front() returns 具有 "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();
对于T object = list.front();
,object
是list.front()
的副本,与原始元素无关。所以list.pop()
对它根本没有任何影响。
对于 T& object = list.front();
,您不能这样做。 const T&
无法隐式转换为 T&
.
对于 const T& object = list.front();
,对象是对 list
中元素的引用。所以在 list.pop()
之后它会被挂起来。
如果你这样做
T object = list.front();
和front()
returnsT&
,那么object
就变成了列表初始元素的copy,不是对其的引用。
另一方面,如果您写
const T& ref = list.front();
那么对 list.pop()
的调用会使 ref
成为悬空引用,这与内存泄漏不同。
这应该可以解释您的第一个示例和第三个示例之间的区别;你的第二个例子,即
T& object = list.front();
无法编译,因为无法从 const
引用构造非 const
引用。
我正在用 C++ 编写单链表模板,我对删除第一个节点时返回第一个节点信息的正确方法感到困惑。
我从一本书中得到了一些帮助,书中写了两种方法,一种是 returns 头节点的值,另一种是删除它。我们将该方法称为 front() 和 pop(),其中 front() returns 具有 "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();
对于T object = list.front();
,object
是list.front()
的副本,与原始元素无关。所以list.pop()
对它根本没有任何影响。
对于 T& object = list.front();
,您不能这样做。 const T&
无法隐式转换为 T&
.
对于 const T& object = list.front();
,对象是对 list
中元素的引用。所以在 list.pop()
之后它会被挂起来。
如果你这样做
T object = list.front();
和front()
returnsT&
,那么object
就变成了列表初始元素的copy,不是对其的引用。
另一方面,如果您写
const T& ref = list.front();
那么对 list.pop()
的调用会使 ref
成为悬空引用,这与内存泄漏不同。
这应该可以解释您的第一个示例和第三个示例之间的区别;你的第二个例子,即
T& object = list.front();
无法编译,因为无法从 const
引用构造非 const
引用。