【问题标题】:C++ Finding Bugs in Code related to linked listsC++ 查找与链表相关的代码中的错误
【发布时间】:2014-03-27 02:22:31
【问题描述】:

有 2 段代码我似乎无法找到错误。我知道这些有问题。每人一份。

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;
}

我想了一会儿这 2 段代码。对于第一段代码,我认为错误在于您不应该使用关键字new 在堆上创建 Node* temp。它应该只是Node* temp = tail;我相信。谁能确认一下?

对于第二段代码,我认为错误是你不需要两者

t = Node(1,t); 
t = Node(2,t); 

编辑::对不起,我犯了一个错误。它应该是节点而不是节点。我的朋友告诉我它必须与记忆有关。由于使用 new 声明了多个节点,是否存在内存泄漏?或者我们是否需要最后 2 个的新关键字?

谢谢

【问题讨论】:

  • node(int, Node*) 是做什么的?
  • 你能展示一下node()函数的实现吗?

标签: c++ list linked-list


【解决方案1】:

当你弹出元素时,你不需要创建一个“新”节点。您必须删除链表的最后一个元素 - 而不是创建新节点。

对于第二个问题,您不需要

t = node(1,t)
t = node(2,t) 

如果函数返回当前添加的节点。 但是如果函数返回链表的头部,则它是必需的。这取决于您如何编写node 函数。

【讨论】:

    【解决方案2】:

    你正在失去新的价值

    Node* temp = new Node();  
    temp = tail;               <-- you just lost the value you new'ed
    

    稍后您将删除另一个节点

    tail-&gt;prev()-&gt;setNext(NULL); &lt;-- this line doesn't check that the value for prev() isn'tnull

    关于 main 中发生了什么,我需要查看更多“节点”的代码

    【讨论】:

      【解决方案3】:

      Dinesh 在第一个例子中是正确的。这里有一点解释。

      Node* temp = new Node()
      temp = tail;
      

      导致内存泄漏。当您将 temp 覆盖到 tail 时,创建的新节点会泄漏。正确的做法是

      Node * temp = tail;
      

      在第二个示例中,它不清楚节点函数的作用。如果你打算这样写:

      int main()
      {   
          Node* t = new Node(0,NULL);
          t = new Node(1,t);
          t = new Node(2,t);
          delete t;
      }
      

      代码会更有意义,它创建了一个由三个节点组成的链表,从头到尾列出时分别包含 2、1、0。从不完整的例子中很难看出。

      【讨论】:

      • 很抱歉。它实际上是 Node(1,t) 但没有 t。那么它需要new关键字吗?
      • 第二个例子又是内存泄漏。您正在使用 new 关键字为 3 个节点分配内存,但只为其中一个释放内存。另外,不要忘记通过单击您认为最佳答案旁边的复选标记的轮廓来选择答案。
      【解决方案4】:

      pop 中,您有内存泄漏。你在堆上构造了一个Node,然后立即失去了对它的追踪,就像给气球充气然后放开它:

      Node* temp = new Node();
      temp = tail;
      

      但是你还有一个更严重的问题:你没有调整tail函数完成后,tail指向了最后一个节点所在的内存区域,并且任何取消引用它的尝试都会导致未定义的行为。

      至于您的第二个问题,代码可能正确,也可能不正确。除非/直到您向我们展示 node(...) 的作用,否则无法判断。

      【讨论】:

        猜你喜欢
        • 2013-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-13
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多