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编译器成功运行。
实际上,如果我随意删除跑步者,那也是正确的。我可以问一下原因可能是免费的还是删除,只是告诉您内存可用而实际上没有清除内部数据,因此您也可以访问下一步。我能问一下如何改进吗?
编译器无法检测到此类逻辑错误!而是,该程序具有未定义的行为,其中包括看似正常的运行,崩溃或产生各种垃圾。导致不确定行为的情况很多(我不能强调很多)
这不是编译错误,但问题(不确定的行为)将在运行时显现出来。如果您选择在未分配的内存上调用free
,则编译器不会阻止您。
您的程序可以正常工作