删除指针 C++ 时的核心转储

Core Dump when deleting pointer C++

我正在学习C++,我正在尝试实现堆栈的pop() 函数。我对何时删除指针以及如何正确删除它们感到困惑。以下代码会导致核心转储错误,但我找到了一些避免核心转储的方法。问题是我将一个指针指向另一个指针,我想同时删除这两个指针。如果我将一个设置为空,我可以同时删除两者,但如果我将一个指向另一个,则我不能同时删除两者。此处适当的操作过程是什么?当一个指向另一个时,为什么我不能同时删除两者?此外,这不是双向链表,我没有跟踪从顶部开始的第二个节点,因此我必须遍历整个列表才能从顶部删除。

我很抱歉,这个问题似乎经常被问到。讨论太多,我无法整理出专门针对我的问题的讨论。

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

您可以删除这两行:

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

它会正常工作。

错误是因为删除同一个指针两次。 previousNode = delPtr只是复制了一个指针,仍然只有一个对象。

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

仅仅因为指针指向某物并不意味着如果您更改指针或它超出范围,您必须delete它。

一般来说,您需要将 deletenew 相匹配。

简而言之,您可以删除这两行注释,因为您已经 delPtr 设置了删除。

您正在删除 curr 节点两次。

出现在这些行中:

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

还有一次在行中:

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

您可以删除前两行。

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