删除指针 C++ 时的核心转储
Posted
技术标签:
【中文标题】删除指针 C++ 时的核心转储【英文标题】:Core Dump when deleting pointer C++ 【发布时间】:2015-11-06 03:55:38 【问题描述】:我正在学习 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
【问题讨论】:
【参考方案1】:您将两次删除 curr
节点。
出现在这些行中:
previousNode = delPtr; //previousNode = NULL;?????
delete previousNode; //unecessary?????
并且在该行中一次:
delete delPtr; //Have to delete this one no matter what
您可以删除前两行。
【讨论】:
【参考方案2】:您可以删除这两行:
previousNode = delPtr; //previousNode = NULL;?????
delete previousNode; //unecessary?????
它会起作用并且是正确的。
错误是由于两次删除同一个指针。
previousNode = delPtr
只是在复制指针,仍然只有一个对象。
【讨论】:
【参考方案3】:您不需要delete
两次,您只是删除了一项。
仅仅因为指针指向的东西并不意味着如果您更改指针或超出范围,您必须delete
。
一般情况下,您需要将delete
s 与new
s 匹配。
简而言之,您可以删除两条注释行,因为您已经设置了 delPtr
以供删除。
【讨论】:
【参考方案4】: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
【讨论】:
以上是关于删除指针 C++ 时的核心转储的主要内容,如果未能解决你的问题,请参考以下文章
C++中char指针中的memset的分段错误(核心转储)[重复]