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

时间:2015-11-06 03:55:39

标签: c++ pointers coredump

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

我道歉,因为这个问题似乎经常被问到。有太多的讨论,我无法理清一个专门解决我的问题的讨论。

;WITH findata AS 
(SELECT
    f.no
    ,COUNT(*) Cnt
FROM
    finance f
GROUP BY 
    f.no)
SELECT 
    * 
FROM 
    findata
WHERE 
     Cnt > (SELECT AVG(Cnt) FROM findata)

4 个答案:

答案 0 :(得分:2)

您要删除curr节点两次。

进入以下几行:

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

并且一次在线:

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

您可以删除前两行。

答案 1 :(得分:1)

您可以删除这两行:

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

它会起作用并且是正确的。

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

答案 2 :(得分:1)

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

仅仅因为指针指向某个意味着你必须delete如果你改变指针或它超出了范围。

通常,您需要将deletenew匹配。

简而言之,您可以删除已注释的行,因为您已设置delPtr进行删除。

答案 3 :(得分: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