【发布时间】:2011-11-24 12:37:32
【问题描述】:
如果我要创建一个节点类,如下所示,并且如果它用于双向链表,它会在解构双向链表时创建一个无限循环吗?或者它会很好地终止?
class Node
{
Node( );
~Node( )
{
delete mNext; //deallocs next node
}
Contact mContact;
Node* mPrevious;
Node* mNext;
};
编辑:如果我将代码修改为这样,它会工作吗?
~Node( )
{
mPrevious = NULL;
if (mNext->mPrevious != NULL)
{
delete mNext; //deallocs next node
}
}
编辑 2:或者这样效果最好?
~Node( )
{
if (mPrevious != NULL)
{
mPrevious = NULL;
delete mNext; //deallocs next node
}
}
【问题讨论】:
-
我不知道你为什么认为它会形成一个无限循环,你应该在删除它之前检查 mNext 是否不为 NULL。
-
由于没有设置 mNext,会发生崩溃。如果您确实在列表中添加了两次您不应该的内容,您也可以删除两次。也不要使用链接列表
-
当 STL 有大量列表结构可供选择时,我不确定为什么要编写自己的双向链表。 (除非这是家庭作业或其他形式的学习练习,也就是说……)
-
@Nican:实际上,如果 mNext 为 NULL,您不应该检查。如果它为空,删除将忽略它。我最讨厌的事情之一是在删除之前检查代码是否为空
-
我只是想澄清一下——我们是在谈论一个循环双向链表,其中“第一个”和“最后一个”元素相互连接,还是只是一个以和开头的普通元素以NULL结尾? @acidzombie24 我不同意,我认为了解简单数据结构如何工作的基础知识很重要,尤其是链表 - 这稍后会让您直观了解其他数据结构以及不同操作的复杂性等。
标签: c++ memory-management doubly-linked-list