相同的代码在Online IDE和本地IDE中给出不同的结果

时间:2017-06-30 10:58:44

标签: c++ pointers linked-list garbage

以下程序用于从已排序的单链表中删除重复项。代码在在线IDE中提供垃圾值。但是当我评论这条线时。

delete curr;

该程序在线IDE本身运行良好。这是我写的功能。代码的其他部分由在线法官明确定义(不是由我)。

此外,没有注释删除curr; 行的代码在本地IDE(代码块)中运行良好。

完整计划: http://ideone.com/9bHab0

为什么我会得到垃圾值?

Node *removeDuplicates(Node *root)
{
 // your code goes here
    struct Node* curr = root,*prev = NULL;
    while(curr)
    {
        if(prev==NULL)
            prev = curr;
        else if(curr->data!=prev->data)
            prev = curr;
        else
        {
            prev->next = curr->next;
            delete curr;
            curr = prev->next;
        }
    }
    return root;
}

编辑:可以看到删除位置的指针,立即重新分配。因此,这里不可能是悬空指针!

1 个答案:

答案 0 :(得分:4)

让我们举一个非常简单的例子,有一个双节点列表,例如,你可以使用

node1 -> node2

通过第一次迭代,prevNULL,因此您执行prev = curr。现在currprev指向同一节点。

这意味着在第二次迭代中,if条件都是假的(prev != NULLcurr->data == prev->data)你进入else部分,你有

prev->next = curr->next;
delete curr;
curr = prev->next;

delete curr 但是 curr指向与prev相同的内存,导致未定义的行为在作业curr = prev->next中,因为您现在取消引用迷路指针prev

更糟糕的是,然后输入第三个​​迭代,其中prev仍然指向已删除的第一个节点,并再次取消引用无效的prev指针(在您的指针中)第二个if条件),您再次进入else部分,继续无效解除引用。等等无穷大(或者你遇到了崩溃)。