【问题标题】:Pointers in a linked list example链表示例中的指针
【发布时间】:2017-09-07 18:11:50
【问题描述】:

在遇到之前我一直在实现一个链表

void StringLinkedList::removeFront(){ 

StringNode *old = head;
head = old -> next;
delete old;

}

我想知道为什么不只做 head = head->next(而不是 head = old->next),当没有任何东西指向前一个地址时,这如何造成内存泄漏(因为 head 节点是现在指向下一个节点)。

非常感谢。

【问题讨论】:

  • 如果你仍然有这 3 行但在第二行中将 old 更改为 head - 代码将相同并且不会引入内存泄漏。

标签: c++ pointers linked-list


【解决方案1】:

C++ 不像其他一些语言那样具有自动垃圾收集功能,一旦不再引用它就会释放存储空间。造成这种情况的原因有很多,可以在Why doesn't C++ have a garbage collector? 中找到有关该主题的讨论。

这意味着newed 必须是deleted,否则你有泄漏。

说你有

如果不delete覆盖head之前的原始值head

节点 1 的地址不再为人所知,因此几乎不可能追踪分配以将其分配给delete。这会导致泄漏。

但是如果你在delete head之前重新指向它,

你不能head->next找到下一个节点,你会丢失并泄露整个列表。

但是,如果您将head的地址临时复制,

old在这种情况下,你可以放心地重新指向head

并且仍然将您需要分配给delete 的地址存储在old 中。

【讨论】:

  • 我正在查看的代码没有使用“新”创建头部,但这是一个错误吗?
  • @coder666 你并没有真正删除head。您正在删除 head 指向的内容。 head 可以指向任何Node,如果head 指向new 创建的Node,迟早有人必须delete 它。关键字:“所有权语义”。在这种情况下,链表是Node 的所有者,head 是链表存储对Node 的引用的地方。至于head 本身,它是一个自动变量,当它超出范围时会为您处理。
  • 我明白了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 2020-01-22
  • 2013-08-07
  • 1970-01-01
相关资源
最近更新 更多