免费注册 查看新帖 |

Chinaunix

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

请教各位一个free堆内存的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-16 22:17 |只看该作者 |倒序浏览
  1.     int StringIndex_KMP(SString s, int pos, SString t)
  2. {

  3.     int i = pos ,j = 1;
  4.     int* nextArray = next(t);
  5.     if( pos < 1 || pos > s[0] - t[0] + 1)
  6.     {
  7.        return  0;
  8.     }
  9.     if (nextArray == NULL)
  10.     {
  11.          return 0;
  12.     }
  13.     while ( i <= s[0] && j <= t[0] )
  14.     {
  15.         if ( j== 0 || s[i] == t[j] )
  16.         {
  17.               i++;
  18.               j++;
  19.         }
  20.         else
  21.         {
  22.              j =  nextArray[j];
  23.         }
  24.     }
  25.     /*
  26.     free(nextArray);
  27.     */
  28.     if ( j > t[0] )
  29.     {
  30.       return (i - t[0]);
  31.     }
  32.     else
  33.     {
  34.       return 0;
  35.     }
复制代码
在next函数里面用malloc动态分配了堆内存,然后将内存首地址指针赋给了nextArray.
因为担心内存泄露,想要在用完该堆内存之后free之,程序编译报错,应该是说找不到分配的内存大小,gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
问题:
1.如果不显式地释放掉这块内存,它的生存期在哪里?
2.如果想要释放该内存防止泄露,应该用什么方法可以做到?

求教各位,谢谢.

论坛徽章:
0
2 [报告]
发表于 2011-05-16 23:53 |只看该作者
把你next函数, gcc的报错信息贴出来, 这样方便大家确认问题。

论坛徽章:
0
3 [报告]
发表于 2011-05-17 09:51 |只看该作者
next函数定义:
  1. int* next(SString pattern)
  2. {
  3.    int i = 1 , j = 0;
  4.    int patternSize = pattern[0];
  5.    int* arrayPtr = (int*) malloc(sizeof(int) * (patternSize + 1));
  6.    if(arrayPtr == NULL)
  7.    {
  8.       return arrayPtr;
  9.    }
  10.    arrayPtr[0] = patternSize;
  11.    while ( i < patternSize )
  12.    {
  13.       if( j== 0 || pattern[i] == pattern[j] )
  14.      {
  15.           i++;
  16.           j++;
  17.           if ( pattern[i] != pattern[j] )
  18.          {
  19.             arrayPtr[i] = j;
  20.          }
  21.           else
  22.          {
  23.             arrayPtr[i] = arrayPtr[j];
  24.          }
  25.      }
  26.      else
  27.      {
  28.            j = arrayPtr[j];
  29.      }
  30.    }
  31.    return arrayPtr;
  32. }
复制代码
奇怪的是,现在把注释干掉,不会报错的了.还是请教以上两个问题.谢谢

论坛徽章:
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
4 [报告]
发表于 2011-05-17 10:18 |只看该作者
1、等到进程结束
2、不用了free
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP