LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: godneedspeed

删除链表函数,在centos5.5下执行正常,在gentoo下报错

[复制链接]
发表于 2010-7-27 02:36:00 | 显示全部楼层
一般的,见到这样的问题
想都不用想,应该立马条件反射的意识到自己的代码出了问题
然后立马拿valgrind来跑跑看
回复 支持 反对

使用道具 举报

发表于 2010-7-27 03:18:31 | 显示全部楼层
void dele_list(struct write_to_mysql *dele_list_begin)
{
  struct write_to_mysql *front *behind, *temp;
  front = dele_list_begin->pre;
  behind = dele_list_begin->next;
  free(dele_list_begin);
  
  while (front) {
        temp = front->pre;
        free(front);
        front = temp;
  }
  while (behind) {
        temp = behind->next;
        free(behind);
        behind = temp;
  }
}

代码是凭技记忆写的..应该没错..一般链表都是这样删除的..
不过我没用过双端链表(这词我还是查了google才知道),所以不太清楚是不是这样写.而且我也很久没写过链表了..

根据我的猜测,你的代码之所以在旧版本的glibc能运行,应该是旧版本对double free的检查不严.你可以尝试不释放pre和next的最后一个指针看看,当然,对于双端链表,也可能是对dele_list_begin二次释放了吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-27 10:03:29 | 显示全部楼层
谢谢大家。

我这次是临时客串的,因为太久不编程了。主要精力都放在mysql c api上了。
我上学的那会,这个叫双向链表。
不过看楼上的代码,有一点疑问,为什么dele_list_begin只free一次,而其他的要free两次呢?

等下午测试过了再来请教。
回复 支持 反对

使用道具 举报

发表于 2010-7-27 10:23:25 | 显示全部楼层
额..看错..
昨天太晚了没怎么看代码,你那个应该是循环链表?我看你最后一个的next到第一个上了
这样就不用两边都释放了..只释放一边就好..
应该是这样把.哈哈..那个循环链表还是我猜的..没怎么学过算法..

void dele_list(struct write_to_mysql *dele_list_begin)
{
struct write_to_mysql  *temp;
dele_list_begin->pre->next = 0;

while (dele_list_begin) {
temp = dele_list_begin->next;
free(dele_list_begin);
dele_list_begin = temp;
}
dele_list_begin = 0; //这忘记是否有必要了...我是学c++的,很少用free..
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-28 15:18:39 | 显示全部楼层
Post by Mie;2105394

dele_list_begin->pre->next = 0;


这句要做什么呢?
回复 支持 反对

使用道具 举报

发表于 2010-7-28 16:04:41 | 显示全部楼层
Post by godneedspeed;2105653
这句要做什么呢?


还是不行??
断掉循环链表,不让他循环而已.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表