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

Same code giving different results in Online IDE and local IDE

下面的程序用于从排序的单链表中删除重复项。该代码在网上给出了垃圾值IDE。但是当我评论这一行时 .

delete curr;

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

还有没有注释行 delete curr; 的代码在本地 IDE(codeblocks).

中工作正常

完整计划: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;
}

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

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

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.

更糟糕的是,您随后进入 third 迭代,其中 prev 仍指向已删除的第一个节点,并再次取消引用无效的 prev 指针(在你的第二个 if 条件下),你再次结束在 else 部分,在那里你继续无效的取消引用。以此类推(否则会崩溃)。