2015-11-06 57 views
-1

我正在学习C++,在这里我试图实现堆栈的pop()函数。我对何时删除指针以及如何正确删除它们感到困惑。以下代码会导致核心转储错误,但我发现了一些避免核心转储的方法。问题是我指向另一个指针的指针,并且我想要同时删除这两个指针。如果我将其中一个设置为null,则可以将两者都删除,但如果我将其中一个指向另一个,则不能同时删除这两个。这里有什么适当的行动方式,为什么我不能在指向另一方时删除它们?此外,这不是一个双向链表,并且我没有跟踪顶端的第二个节点,所以我必须遍历整个列表以从顶端删除。删除指针C++时的核心转储

我很抱歉,因为这个问题似乎经常被问到。有太多的讨论,我不能理清具体解决我的问题。

int List::pop() { 
    int result = -1; 
    if (head != NULL) { 
     result = curr->data; 
     nodePtr delPtr; 
     if (curr == head) { 
      delPtr = head; 
      head = NULL; 
     } 
     else { 
      nodePtr previousNode = head; 
      while(previousNode->next != curr) { 
       previousNode = previousNode->next; 
      } 
      delPtr = curr; 
      curr = previousNode; 
      curr->next = NULL; 
      previousNode = delPtr; //previousNode = NULL;????? 
      delete previousNode;  //unecessary????? 
     } 
    delete delPtr; //Have to delete this one no matter what 
    } 
    else { 
     cout << "The stack is empty" << endl; 
    } 
    return result; 
}//END pop 

回答

2

您正在删除curr节点两次。

一旦这些行:

previousNode = delPtr; //previousNode = NULL;????? 
delete previousNode;  //unecessary????? 
在该行

,一旦:

delete delPtr; //Have to delete this one no matter what 

您可以删除前两行。

1

您可以删除这两个行:

previousNode = delPtr; //previousNode = NULL;????? 
delete previousNode;  //unecessary????? 

,也将努力和正确的。

错误来自删除同一指针两次。 previousNode = delPtr只是制作指针的副本,仍然只有一个对象。

1

您不需要delete两次,您只需删除一个项目。

仅仅因为一个指针指向某个东西不是意味着如果你改变了指针或者它超出了作用域,你必须去delete

通常,您需要将delete s与new s匹配。

总之,您可以删除已注册的行,因为您已经设置了delPtr以删除。

0
int List::pop() 
{ 
    int result = -1; 
    if (head != NULL) 
    { 
     nodePtr prev = head; 
     nodePtr curr = head; 

     while (curr->next != NULL) 
     { 
      prev = curr; 
      curr = curr->next; 
     } 

     result = curr->data; 
     if (head == curr) 
     { 
      head = NULL; 
     } 
     else 
     { 
      prev->next = NULL; 
     } 

     delete curr; 
    } 
    else 
    { 
     cout << "The stack is empty" << endl; 
    } 
    return result; 
}//END pop