c++查找与链表相关的代码bug



有两段代码我似乎找不到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(...)是做什么的,否则我们无从得知。

相关内容

  • 没有找到相关文章

最新更新