免费注册 查看新帖 |

Chinaunix

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

c内存释放出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-28 13:52 |只看该作者 |倒序浏览
本帖最后由 bjkillall 于 2010-09-28 16:45 编辑


上面的截图是小弟的程序在运行结束时的提示,查找了好久结果也没有找到,知道本版有很多大牛,所以发上来跟大家咨询一下;
下面是我的内存分配和回收部分的代码;

【分配一】
222     char* seqing[685];
223     int a;
224     for(a=0;a<685;a++)
225     {
226         seqing[a]=(char*)malloc(sizeof(char)*1024);
227     }

【分配二】
252     char* item[5];
253     int m;
254     for(m=0;m<5;m++)
255     {
256         item[m]=(char*)malloc(sizeof(char)*204;
257     }


【回收】
317     for(n=0;n<685;n++)
318     {
319         free(seqing[n]);
320     }
321     for(n=0;n<5;n++)
322     {
323         free(item[n]);
324     }

大家看看有没有什么问题,谢谢了~



应大家要求我把main函数的代码发给大家;同时大家也可以给一下优化建议;
  1. int main(int argc,char* argv[])
  2. {
  3.     if (argc!=3)
  4.     {
  5.         printf("[USAGE:] %s matchFile illegalFile.\n",argv[0]);
  6.         return 0;
  7.     }

  8.     FILE* matchFile=fopen(argv[1],"r");
  9.     assert(matchFile!=NULL);

  10.     FILE* illegalFile=fopen(argv[2],"r");
  11.     assert(illegalFile!=NULL);

  12.     FILE* HEFA=fopen("./hefa.txt","a+");
  13.     assert(HEFA!=NULL);

  14.     FILE* FEIFA=fopen("./feifa.txt","a+");
  15.     assert(FEIFA!=NULL);

  16.     FILE* FEIFA_LINE=fopen("./feifa_line.txt","a+");
  17.     assert(HEFA!=NULL);

  18.     FILE* FEIFA_DETAIL=fopen("./feifa_detail.txt","a+");
  19.     assert(HEFA!=NULL);

  20.     char* seqing[685];
  21.     int a;
  22.     for(a=0;a<685;a++)
  23.     {
  24.         seqing[a]=(char*)malloc(sizeof(char)*1024);
  25.     }
  26.     //memset(seqing,0,sizeof(seqing));
  27.     char buffer[1024];
  28.     memset(buffer,0,sizeof(buffer));
  29.     int i=0;
  30.     while((fgets(buffer,1023,illegalFile)!=NULL)&&(i<685))
  31.     {
  32.         char* ptest=strtrim_ln(buffer);  //这一行的目的是将fgets读进来的'\n'转化成'\0'
  33.         strcpy(seqing[i],ptest);
  34.         i++;
  35.     }



  36.     int line[685];   
  37.     for(i=0;i<685;i++)
  38.     {
  39.         line[i]=0;
  40.     }
  41.     int detail[685];
  42.     for(i=0;i<685;i++)
  43.     {
  44.         detail[i]=0;
  45.     }

  46.     char* item[5];
  47.     int m;
  48.     for(m=0;m<5;m++)
  49.     {
  50.         item[m]=(char*)malloc(sizeof(char)*2048);
  51.     }
  52.     char sbuffer[2048];
  53.     while(fgets(sbuffer,2047,matchFile)!=NULL)       //sbuffer的格式如下 : 字符串'\t'数字 ,'\t'表示两者之间的分割符;
  54.     {
  55.         char middle[2047];
  56.         memset(middle,0,sizeof(middle));
  57.         strcpy(middle,sbuffer);
  58.         char* pmiddle=strtrim_ln(middle);


  59.         SplitStr(pmiddle,item,5,'\t');    //该行的目的是以'\t'为标记切割pmiddle,分别存在item[0]到item[4]中,最大分割成5个部分

  60.         int i;
  61.         int flag=0;
  62.         for(i=0;i<685;i++)
  63.         {
  64.             if(compare(item[0],seqing[i])==0)  //该行的目的就是匹配item[0]和seqing[i],成功返回0,并且将相关信息写入文件;
  65.             {
  66.                 flag=1;
  67.                 line[i]=line[i]+1;
  68.                 int mid=atoi(item[1]);
  69.                 detail[i]=detail[i]+mid;
  70.                 fwrite(item[0],strlen(item[0]),1,FEIFA);
  71.                 fwrite("\t",1,1,FEIFA);
  72.                 fwrite(item[1],strlen(item[1]),1,FEIFA);
  73.                 fwrite("\n",1,1,FEIFA);
  74.                 break;
  75.             }
  76.         }
  77.         if(0 == flag)
  78.         {
  79.             fwrite(item[0],strlen(item[0]),1,HEFA);
  80.             fwrite("\t",1,1,HEFA);
  81.             fwrite(item[1],strlen(item[1]),1,HEFA);
  82.             fwrite("\n",1,1,HEFA);
  83.         }

  84.     }

  85.     int n=0;

  86.     for(n=0;n<685;n++)
  87.     {
  88.         fwrite(seqing[n],strlen(seqing[n]),1,FEIFA_LINE);
  89.         fwrite("\t",1,1,FEIFA_LINE);
  90.         char str1[100];
  91.         memset(str1,0,sizeof(str1));
  92.         sprintf(str1,"%d",line[n]);
  93.         fwrite(str1,strlen(str1),1,FEIFA_LINE);
  94.         fwrite("\n",1,1,FEIFA_LINE);

  95.         fwrite(seqing[n],strlen(seqing[n]),1,FEIFA_DETAIL);
  96.         fwrite("\t",1,1,FEIFA_DETAIL);
  97.         char str2[100];
  98.         memset(str2,0,sizeof(str2));
  99.         sprintf(str2,"%d",detail[n]);
  100.         fwrite(str2,strlen(str2),1,FEIFA_DETAIL);
  101.         fwrite("\n",1,1,FEIFA_DETAIL);
  102.     }

  103.     for(n=0;n<685;n++)
  104.     {
  105.         free(seqing[n]);
  106.     }
  107.     for(n=0;n<5;n++)
  108.     {
  109.         free(item[n]);
  110.     }

  111.     fclose(matchFile);
  112.     fclose(illegalFile);
  113.     fclose(HEFA);
  114.     fclose(FEIFA);
  115.     fclose(FEIFA_LINE);
  116.     fclose(FEIFA_DETAIL);
  117.     return 0;
  118. }
复制代码
好了,有一些自己写的函数我已经在后面标记了,如果有什么地方有问题大家可以提出来,帮我分析下这个问题吧,我搞不定了~

论坛徽章:
0
2 [报告]
发表于 2010-09-28 14:10 |只看该作者
感觉没啥问题。LZ贴完整测试代码吧。

论坛徽章:
0
3 [报告]
发表于 2010-09-28 14:15 |只看该作者
请先试着检查一下malloc返回值 不是所有malloc都执行成功 如何返回NULL,那你后面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
4 [报告]
发表于 2010-09-28 14:17 |只看该作者
应该是中间把指针给破坏了,free NULL不会有问题的

论坛徽章:
0
5 [报告]
发表于 2010-09-28 15:33 |只看该作者
回复 1# bjkillall


感觉LZ对指针的概念还不是很熟悉
char* seqing[685];是一个指向数组的指针,而不是像LZ所想这个数组中的元素是指针。

论坛徽章:
0
6 [报告]
发表于 2010-09-28 15:43 |只看该作者
回复  bjkillall


感觉LZ对指针的概念还不是很熟悉
char* seqing[685];是一个指向数组的指针,而不是 ...
mournjust 发表于 2010-09-28 15:33


是你错了

论坛徽章:
0
7 [报告]
发表于 2010-09-28 15:46 |只看该作者
回复 5# mournjust


    是你弄错了.楼主那样定义没问题.

论坛徽章:
0
8 [报告]
发表于 2010-09-28 16:15 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2010-09-28 16:22 |只看该作者
回复  bjkillall


感觉LZ对指针的概念还不是很熟悉
char* seqing[685];是一个指向数组的指针,而不是 ...
mournjust 发表于 2010-09-28 15:33


lz没有错..lz的seqing是色情的意思吗

论坛徽章:
0
10 [报告]
发表于 2010-09-28 16:26 |只看该作者
回复 9# 论坛ID


    这是一个不能说的秘密~哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP