删除指针 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

一般情况下,您需要将deletes 与news 匹配。

简而言之,您可以删除两条注释行,因为您已经设置了 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的分段错误(核心转储)[重复]

核心转储,如何增加矩阵维度(可用),在 C 中释放 2d 指针时出错

c++:分段错误(核心转储)

使用 gdb 检查指针是不是可能在核心转储中有效 [重复]

Realloc 无效指针。中止(核心转储)

防止核心转储使用空指针初始化字符串