免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2806 | 回复: 11
打印 上一主题 下一主题

关于 free 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-25 11:12 |只看该作者 |倒序浏览
本帖最后由 787686358 于 2012-05-25 13:54 编辑

free () 出现  double free or corruption (out): 0x0804b038 *** 这样的问题 然后直接 SIGABRT  信号  宕掉了!

264
265 int listRemove(LIST *list, int pos)
266 {
267   int i;
268
269   list_item_t  *item;
270   if (list == NULL || list ->array == NULL)  return -1;
271   if (pos <0 || pos >= list ->size)          return -1;
272   item = list ->array[pos];
273   if (item ->flag && item ->data)
274     free (item ->data);
275   free (item);
276   if (pos <list ->size-1) {
277     for (i=pos; i<list->size-1; i++)
278       list ->array = list ->array[i+1];
279       list ->array[i+1] = NULL;
280   }
281   list ->size--;
282   return 0;
283 }
284

程序 执行到 free (item)  的时候 出现问题!

问题补充:    item  内存是如何申请的!
0
31 LIST  *listCreate(int capacity)
32 {
33   int i;
34   LIST *list;
35
36   if (capacity <= 0)
37     capacity = LIST_INIT_CAPACITY;
38
39   list = (LIST *)malloc(sizeof(LIST));          /* 为结构体分配内存,*/
40   if (list==NULL)  {
41     printf("\nmalloc  is fial\n ");
42     return  NULL;
43   }
44   list ->size = 0;
45   list ->capacity = capacity;
46   list ->array =(list_item_t **)malloc(sizeof(list_item_t *) * capacity);

49   if (list ->array == NULL)  {
50     printf ("\n malloc is fail\n ");
51     return -1;
52   }
53   for (i=0; i<capacity; i++) {
54     list ->array = NULL;
55   }
56   return list;
57 }
58


128 int _listAdd(LIST *list, void *data, int len, int flag)
129 {
130   list_item_t *item;
131
132
133   if (list == NULL || list ->array ==NULL) return -1;
134   item = (list_item_t *)malloc(sizeof( list_item_t));
135   if (item == NULL)  {
136     printf("malloc is fail  %d",__LINE__);
137     return -1;
138   }
139   if (data == NULL || len ==0) {
140     data = NULL;
141     len = 0 ;
142     flag = 0;
143   }
144   if (flag)  {
145     item ->data = malloc(len);
146     if (item ->data == NULL) {
147       printf("malloc fail %d\n",__LINE__);
                                                                                                                  106,5         28%
368   printf ("\nAdd  ret =%d" ,ret);


谢谢~~

报错 :
76          free(item);                                 /* 释放的是 list_item_t *   */
(gdb) p  item
$1 = (list_item_t *) 0x804b038
(gdb) n
*** glibc detected *** /home/bsp/gxh/src/demo: double free or corruption (out): 0x0804b038 ***
======= Backtrace: =========
/lib/libc.so.6[0x1bb231]
/home/bsp/gxh/src/demo[0x8048588]
/home/bsp/gxh/src/demo[0x8048db9]
/lib/libc.so.6(__libc_start_main+0xe6)[0x161a66]
/home/bsp/gxh/src/demo[0x80483f1]
======= Memory map: ========
00127000-00147000 r-xp 00000000 fd:00 546        /lib/ld-2.10.1.so
00147000-00148000 r--p 0001f000 fd:00 546        /lib/ld-2.10.1.so
00148000-00149000 rw-p 00020000 fd:00 546        /lib/ld-2.10.1.so
0014b000-002b6000 r-xp 00000000 fd:00 547        /lib/libc-2.10.1.so
002b6000-002b7000 ---p 0016b000 fd:00 547        /lib/libc-2.10.1.so
002b7000-002b9000 r--p 0016b000 fd:00 547        /lib/libc-2.10.1.so
002b9000-002ba000 rw-p 0016d000 fd:00 547        /lib/libc-2.10.1.so
002ba000-002bd000 rw-p 002ba000 00:00 0
004ba000-004e4000 r-xp 00000000 fd:00 560        /lib/libgcc_s-4.4.0-20090506.so.1
004e4000-004e5000 rw-p 00029000 fd:00 560        /lib/libgcc_s-4.4.0-20090506.so.1
00a9c000-00a9d000 r-xp 00a9c000 00:00 0          [vdso]
08048000-0804a000 r-xp 00000000 fd:00 171275     /home/bsp/gxh/src/demo
0804a000-0804b000 rw-p 00001000 fd:00 171275     /home/bsp/gxh/src/demo
0804b000-0806c000 rw-p 0804b000 00:00 0          [heap]
b7fe6000-b7fe7000 rw-p b7fe6000 00:00 0
b7ffe000-b8000000 rw-p b7ffe000 00:00 0
bffeb000-c0000000 rw-p bffeb000 00:00 0          [stack]
2  str2 =bbbbbbbbbbbbb



论坛徽章:
0
2 [报告]
发表于 2012-05-25 11:36 |只看该作者
干嘛要free一个局部变量?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2012-05-25 11:41 |只看该作者
要看list ->array的内存怎么来的

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2012-05-25 12:05 |只看该作者

  1. 275   free (item);
复制代码
the memory is free here.

  1. 276   if (pos <list ->size-1) {
  2. 277     for (i=pos; i<list->size-1; i++)
  3. 278       list ->array[i] = list ->array[i+1];
  4. 279       list ->array[i+1] = NULL;
  5. 280   }
复制代码
but you acess the freed memory here....

论坛徽章:
0
5 [报告]
发表于 2012-05-25 13:32 |只看该作者
回复 4# folklore


谢谢,但是还没有运行到这一步的~~

   

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
6 [报告]
发表于 2012-05-25 14:31 |只看该作者

  1. list ->array =(list_item_t **)malloc(sizeof(list_item_t *) * capacity);
复制代码
the memory of list->array are not allocated.
change it to

  1. list ->array =(list_item_t **)malloc(sizeof(list_item_t *) * capacity);
  2. for(int iAlloc=0;iAlloc<capacity;iAlloc++){
  3.    list->array[iAlloc]=(list_item_t *)malloc(sizeof(list_item_t));
  4. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-05-25 14:58 |只看该作者
我在 listAdd 函数 里  分配了  item 的内存!  
在 向列表里面 添加元素的时候再给 原远 item  分配内存的!

一开始 只是 分配 了 LIST     跟   array = (list_item_t ** )malloc( (list_item_t *)* capacity);

只有在向列表存放 元素 item 的时候  才分配内存!
list_item_t  *item  ; item = (list_item_t *) malloc (sizeof(list_itme_t));

list ->array[pos] = item ;
现在 free (item ) 的出现问题!~~

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
8 [报告]
发表于 2012-05-25 15:06 |只看该作者
787686358 发表于 2012-05-25 14:58
我在 listAdd 函数 里  分配了  item 的内存!  
在 向列表里面 添加元素的时候再给 原远 item  分配内存的 ...

int the funtion
int _listAdd(LIST *list, void *data, int len, int flag)

do you forget to write a sentence that like
list->arry[xx]=item;?

论坛徽章:
0
9 [报告]
发表于 2012-05-25 15:14 |只看该作者
呵呵~~ 非常感谢帮我看这么多了   list->array[xx] = item  在  函数中已经有了~~

int _listAdd(LIST *list, void *data, int len, int flag)
{
  list_item_t *item;


  if (list == NULL || list ->array ==NULL) return -1;
  item = (list_item_t *)malloc(sizeof( list_item_t));
  if (item == NULL)  {
    printf("malloc is fail  %d",__LINE__);
    return -1;
  }
  if (data == NULL || len ==0) {
    data = NULL;
    len = 0 ;
    flag = 0;
  }
  if (flag)  {
    item ->data = malloc(len);
    if (item ->data == NULL) {
      printf("malloc fail %d\n",__LINE__);
      free(item);
      return -1;
    }
    memcpy(item ->data, data, len);
    item ->flag = 1;
  }
  else {
    item ->data = data;
    item ->flag = 0;

  }
  item ->len = len;
  list ->array[list ->size] = item;
  list ->size = list->size +1;                       /*list ->size ++; */
  return 0 ;
}

论坛徽章:
0
10 [报告]
发表于 2012-05-25 16:47 |只看该作者
  1. 44   list ->size = 0;
  2. 45   list ->capacity = capacity;
  3. 46   list ->array =(list_item_t **)malloc(sizeof(list_item_t *) * capacity);

  4. 49   if (list ->array == NULL)  {
  5. 50     printf ("\n malloc is fail\n ");
  6. 51     return -1;
  7. 52   }
  8. 53   for (i=0; i<capacity; i++) {
  9. 54   [color=Red]  list ->array = NULL;[/color] 前面分配了内存,这里又给指针置空,不久能与没有分配么,而且前面分配的还泄露了。。
  10. 55   }
  11. 56   return list;
  12. 57 }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP