有两段代码我似乎找不到bug。我知道这里面有问题。
int pop()
{
Node* temp = new Node();
temp = tail;
tail->prev()->setNext(NULL);
int tempV = temp->key();
delete temp;
return tempV;
}
另一段代码是:
int main()
{
Node* t = new Node(0,NULL);
t = Node(1,t);
t = Node(2,t);
delete t;
}
我思考了一会儿这两段代码。对于第一段代码,我认为错误在于您不应该在堆上使用关键字new
创建Node* temp。应该是Node* temp = tail
;我相信。有人能证实吗?
对于第二段代码,我认为错误是您不需要两个
t = Node(1,t);
t = Node(2,t);
我很抱歉我犯了一个错误。它应该是Node而不是Node。我朋友告诉我这和记忆有关。是否有内存泄漏,因为多个节点被声明为新的?还是我们需要最后2个的新关键字?谢谢
弹出元素时,不需要创建"新"节点。你必须删除链表的最后一个元素——而不是创建一个新节点。
第二个问题,不需要
t = node(1,t)
t = node(2,t)
如果函数返回当前添加的节点。但是,如果函数返回链表的头,那么它是必需的。这取决于你怎么写node
函数
你正在失去你的新价值
Node* temp = new Node();
temp = tail; <-- you just lost the value you new'ed
然后删除另一个节点
tail->prev()->setNext(NULL); <-- this line doesn't check that the value for prev() isn't
null
至于main中发生了什么,我需要看到更多的"node"代码
Dinesh在第一个例子中是正确的。这里有更多的解释。
Node* temp = new Node()
temp = tail;
导致内存泄漏。将temp覆盖到tail时,已创建的新节点泄漏。正确的做法是
Node * temp = tail;
在第二个例子中,node函数的作用并不清楚。如果你想写这个:
int main()
{
Node* t = new Node(0,NULL);
t = new Node(1,t);
t = new Node(2,t);
delete t;
}
代码会更有意义,它创建了一个三个节点的链表,从头到尾列出时包含2,1,0。从不完整的例子中很难判断。
在pop
中有内存泄漏。你在堆上构造一个Node
,然后立即失去对它的跟踪,就像给气球充气然后让它飞走一样:
Node* temp = new Node();
temp = tail;
但是你也有一个更严重的问题:你没有调整tail
.当函数完成时,tail
指向一个内存区域,那里曾经是最后一个节点,任何试图解引用它将导致未定义的行为。
至于你的第二个问题,代码可能是正确的,也可能不是。除非你告诉我们node(...)
是做什么的,否则我们无从得知。