我正在学习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)
答案 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
如果你改变指针或它超出了范围。
通常,您需要将delete
与new
匹配。
简而言之,您可以删除已注释的行,因为您已设置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