删除指针 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
它。
一般来说,您需要将 delete
与 new
相匹配。
简而言之,您可以删除这两行注释,因为您已经 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
我正在学习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
它。
一般来说,您需要将 delete
与 new
相匹配。
简而言之,您可以删除这两行注释,因为您已经 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