为什么此功能不会引起错误?

问题描述 投票:1回答:3
void removeDuplicateWithHashtable(LinkedListElement<char> *head)
{
    LinkedListElement<char> *runner = head;
    LinkedListElement<char> *previous = nullptr;
    hash_map<char, bool> record;
    while (runner) {
        if (record.count(runner->Data) == 0) {
            pair<char, bool> item(runner->Data,true);
            record.insert(item);
        }else
        {
            free(runner);
            previous->Next = runner->Next;
        }
        previous=runner;
        runner=runner->Next;
    }
}

起初我以为会有错误。因为在free(runner)中,如果我释放内存,则无法访问Runner-> Next。但是GCC编译器成功运行。

实际上,如果我随意删除跑步者,那也是正确的。我可以问一下原因可能是免费的还是删除,只是告诉您内存可用而实际上没有清除内部数据,因此您也可以访问下一步。我能问一下如何改进吗?

c++
3个回答
3
投票

编译器无法检测到此类逻辑错误!而是,该程序具有未定义的行为,其中包括看似正常的运行,崩溃或产生各种垃圾。导致不确定行为的情况很多(我不能强调很多)


3
投票

这不是编译错误,但问题(不确定的行为)将在运行时显现出来。如果您选择在未分配的内存上调用free,则编译器不会阻止您。


1
投票

您的程序可以正常工作

© www.soinside.com 2019 - 2024. All rights reserved.