错误的一个思路,往往导致一个很难查询的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的操作,切忌要注意使用野指针