【发布时间】:2016-03-07 21:06:20
【问题描述】:
我正在为大学课程学习book 中的链表。我在删除链表中的节点时遇到问题。列表的给定结构是
struct Node {
int item;
Node *next;
}
在本书的部分中,正在演示使用两个指针删除节点:prev 和 cur(其中 cur 指向要删除的节点)。
将prev重新路由到cur之后的节点:
prev->next = cur->next;
我们继续释放用于当前节点的内存。我的问题是这部分,使用的代码是:
cur->next = NULL;
delete cur;
cur = NULL;
第一行和第三行不是多余的吗?还是我缺少什么?因为我们像在第二行中那样删除 cur 那么我们不需要先设置 cur->next= null 对吗?
在书中它给出了explanation,但它没有多大意义。有什么帮助吗?
【问题讨论】:
-
很多书都不是很好,很遗憾。
-
是的,你是对的。将
cur设置为空可能如果您保留指针以供以后使用。否则不行。将next设置为 null 是没有用的。 -
@molbdnilo:它不是防御性的!设置
cur->next设置一个值,其访问在下一行开始时变为未定义。如果有什么应该设置已删除内存的内容,那将是 [debugging]operator delete。将cur设置为NULL是否合理,取决于是否继续使用。如果它只是一个在下一行超出范围的局部变量,它仍然没有意义。 -
如果造成如此多的 FUD,那所谓的“防御性编程”又有什么意义呢?与在下一行中读取内容之前对缓冲区进行货物崇拜归零相同。新手看到这样的垃圾,完全不知所措。
-
@MartinJames 并在
new Socket(...)之后立即测试一个套接字是否为空,并测试它是否已连接,如果不是,它会抛出异常。 ...
标签: c++ linked-list