錯誤的一個思路,往往導致一個很難查詢的bug,上週在實現數據存儲鏈表時,由於思路的不嚴謹,導致一個bug查了大半天,代碼原先是這樣的
while(p)
{
if(id == p->uniqueid)
{
if(p != list->head)
{
p->prev->next = p->next;
if(p->next != NULL)
{
p->next->prev = p->prev;
}
}
else
{
list->head = p->next;
}
if(p->external_ip)
free(p->external_ip);
if(p->internal_ip)
free(p->internal_ip);
free(p);
break;
}
p = p->next;
}
額,好吧,在原先的項目中曾經有過這樣的代碼,後面修過了,這次又發生了,一塊石頭踢了兩次腳,很明顯,在搜索到了的時候我這邊是調用了free(p),但僅接着又做了p = p->next,額,這個就有點難爲情了,操作空指針了,好吧,這確實會導致一個fatal signal 11的問題!
後面更正後的代碼
while(p)
{
if(id == p->uniqueid)
{
result = p->next;
if(p != list->head)
{
p->prev->next = p->next;
if(p->next != NULL)
{
p->next->prev = p->prev;
}
}
else
{
list->head = p->next;
}
if(p->external_ip)
free(p->external_ip);
if(p->internal_ip)
free(p->internal_ip);
free(p);
break;
}
else
p = p->next;
}
告訴自己,在查詢的時候要是做delete的操作,切忌要注意使用野指針