【发布时间】:2017-07-28 12:53:02
【问题描述】:
template<typename T>
T& List<T>::popFront()
{
if (head == NULL)
throw std::underflow_error("List error: no head node available\n");
if (tail == head)
tail = NULL;
T item = head->item;
head = head->next;
return item;
}
我有一个包含以下字段的递归结构 ListNode:
template <typename T>
struct ListNode {
T item;
ListNode* next;
...
}
问题是我想在 popFront 过程之后释放一个头节点,但是由于所有嵌套节点都间接指向同一个地址,它们的地址也从堆中消失了。所以现在正如你在上面看到的,我只是将头节点的指针地址更改为下一个,我认为这会导致内存泄漏。
我不排除我对这种方法和我的假设绝对错误。请考虑执行此类任务的最有效方式,如果这种释放确实是必要的。
【问题讨论】:
-
您返回对本地自动变量的引用。使用返回的引用具有未定义的行为。
-
@user2079303 是的,没注意到,修复它。
-
" 请考虑执行此类任务的最有效方式" 答案是使用久经考验的标准库,所以
std::list或std::forward_list.它的作者知道他们在做什么并编写高效的代码。 -
@underscore_d 显然在实际项目中我将使用标准库中的功能,但为了寻求经验,我尝试自己实现一些数据结构
-
@KirillKorolev 当自己实现数据结构只是为了好玩时,我建议寻找最简单的正确方法,而不是首先寻找最有效的方法。如果你幸运的话,它们是一样的。
标签: c++ pointers memory-leaks nested