C++ 链表示例中的指针

C++ 链表示例中的指针,c++,pointers,linked-list,C++,Pointers,Linked List,我在实现一个链表,直到我遇到 void StringLinkedList::removeFront(){ StringNode *old = head; head = old -> next; delete old; } 我想知道为什么不直接执行head=head->next而不是head=old->next,因为head节点现在指向下一个节点,所以当没有任何东西指向上一个地址时,这如何创建内存泄漏 非常感谢。C++不像其他一些语言那样具有自动垃圾收集功能,这些语言在不再引用存储时

我在实现一个链表,直到我遇到

void StringLinkedList::removeFront(){ 

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

}
我想知道为什么不直接执行head=head->next而不是head=old->next,因为head节点现在指向下一个节点,所以当没有任何东西指向上一个地址时,这如何创建内存泄漏


非常感谢。

C++不像其他一些语言那样具有自动垃圾收集功能,这些语言在不再引用存储时会释放存储。原因有很多,关于这个主题的讨论可以在中找到

这意味着必须删除新添加的内容,否则将导致泄漏

说你有

如果在覆盖磁头之前未删除磁头的原始值

节点1的地址不再为人所知,因此几乎不可能跟踪分配以将其删除。这迫使泄漏

但如果在重新指向头部之前删除头部

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

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

在这种情况下,你可以安全地重新点头


并且仍然有您需要删除的分配地址存储在old中。

C++没有自动垃圾收集功能,就像其他一些语言一样,一旦不再引用存储就会释放它。原因有很多,关于这个主题的讨论可以在中找到

这意味着必须删除新添加的内容,否则将导致泄漏

说你有

如果在覆盖磁头之前未删除磁头的原始值

节点1的地址不再为人所知,因此几乎不可能跟踪分配以将其删除。这迫使泄漏

但如果在重新指向头部之前删除头部

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

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

在这种情况下,你可以安全地重新点头


并且仍将需要删除的分配地址存储在旧版中。

如果仍有这3行,但在第二行中将旧版更改为head-代码将保持不变,不会出现内存泄漏。如果仍有这3行,但在第二行中将旧版更改为head-代码将保持不变,不会出现内存泄漏将被介绍。我看到的代码没有创建带有“new”的head,但这是一个错误吗?@coder666您并不是真的在删除head。您正在删除head指向的内容。头部可以指向任何节点,如果头部指向由new创建的节点,则迟早会有人将其删除。关键词:所有权语义。在这种情况下,链表是节点的所有者,头部是链表存储对节点引用的位置。至于head本身,它是一个自动变量,当它超出范围时,将为您处理。我明白了!非常感谢。我看到的代码没有用“new”创建head,但这是一个错误吗?@coder666您并不是真的在删除head。您正在删除head指向的内容。头部可以指向任何节点,如果头部指向由new创建的节点,则迟早会有人将其删除。关键词:所有权语义。在这种情况下,链表是节点的所有者,头部是链表存储对节点引用的位置。至于head本身,它是一个自动变量,当它超出范围时,将为您处理。我明白了!非常感谢。