LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1138|回复: 14

嵌套循环释放内存为何行不通阿??? 各位大虾救小妹一命阿!!!

[复制链接]
发表于 2005-3-12 13:17:48 | 显示全部楼层 |阅读模式
C 程序中,在主函数中两个嵌套(共5600次)循环调用一个建立链表的函数,结果运行756次就 segmentation fault 了,猜想是没释放内存的原因,于是在每次循环中将分配的内存用 free释放,结果运行到这一句就segmentation fault.  这是怎么回事啊? 有什么好办法阿?

由于建立链表的函数也是两个嵌套循环建立两种类型的链表,所以我想也应该如是释放内存(如下):

for(m1=0;m1<cl1->nchain;m1++) {ch1=cl1->Cincluster[m1];
      for(p1=ch1->Astart->next; p1; p1=p1->next) free(p1);
               free(ch1);}

为什么行不通阿?  大虾救命! :mad:
发表于 2005-3-12 13:52:52 | 显示全部楼层
Post by meilan
C 程序中,在主函数中两个嵌套(共5600次)循环调用一个建立链表的函数,结果运行756次就 segmentation fault 了,猜想是没释放内存的原因,于是在每次循环中将分配的内存用 free释放,结果运行到这一句就segmentation fault.  这是怎么回事啊? 有什么好办法阿?

由于建立链表的函数也是两个嵌套循环建立两种类型的链表,所以我想也应该如是释放内存(如下):

for(m1=0;m1<cl1->nchain;m1++) {ch1=cl1->Cincluster[m1];
      for(p1=ch1->Astart->next; p1; p1=p1->next) free(p1);
               free(ch1);}

为什么行不通阿?  大虾救命! :mad:

我觉得你不是一般的错啊, 概念很不清晰
链表是这样建的吗?
即使链表建对了,释放内存是怎么能这样做呢?
释放了第一个节点后p1就不存在了,再执行p1->next不出segmentary fault才是怪事
回复 支持 反对

使用道具 举报

发表于 2005-3-12 14:02:37 | 显示全部楼层
Post by meilan
C 程序中,在主函数中两个嵌套(共5600次)循环调用一个建立链表的函数,结果运行756次就 segmentation fault 了,猜想是没释放内存的原因,于是在每次循环中将分配的内存用 free释放,结果运行到这一句就segmentation fault.  这是怎么回事啊? 有什么好办法阿?

由于建立链表的函数也是两个嵌套循环建立两种类型的链表,所以我想也应该如是释放内存(如下):

for(m1=0;m1<cl1->nchain;m1++) {ch1=cl1->Cincluster[m1];
      for(p1=ch1->Astart->next; p1; p1=p1->next) free(p1);
               free(ch1);}

为什么行不通阿?  大虾救命! :mad:

我觉得你不是一般的错啊, 概念很不清晰
链表是这样建的吗?
即使链表建对了,释放内存是怎么能这样做呢?
释放了第一个节点后p1就不存在了,再执行平p1=p1->next不出segmentary fault才是怪事
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 20:28:29 | 显示全部楼层
多谢这位大侠!
我链表是建对了的,可运行.
那我的问题该如何解决? 是否必须在运行一个循环时分配了,并且不再用了就释放掉?
那是否应从链表的末端向前逐个释放?
回复 支持 反对

使用道具 举报

发表于 2005-3-12 20:55:19 | 显示全部楼层

可以从头删,但要注意:

在删p1前要先取p1->next。

例如:

  1. for(p1=ch1->Astart->next; p1; p1=p1->next) free(p1);
复制代码

这样的用法是错的。

可以这样:

  1. for(p1=ch1->Astart->next; p1; p1 = q)
  2. {
  3.     q = p1->next;
  4.     free(p1);
  5. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 21:19:43 | 显示全部楼层
多谢了!
这个地方的聪明人好多啊.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 22:00:43 | 显示全部楼层
好像还是不行. 多算了一些循环,又 segmentation fault 了.
应该不是内存的问题了吧, 我每次都释放掉了呀.
回复 支持 反对

使用道具 举报

发表于 2005-3-13 09:10:52 | 显示全部楼层
方便把源程序贴出来么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-13 10:56:31 | 显示全部楼层
主体部分是:
for(j=-100;j<101;j++){
    for(q=0;q<10;q++) { printf("\n");
       for(h=0;h<27;h++){potent[q][h]=energy[q][h]+0.3*j;printf(" %f",potent[q][h]);}} printf("\n");
     xm=0.0;ym=0.0;xs=0.0;ys=0.0;r=0.0;a=0.0;b=0.0;fm=0.0;fzx=0.0;fzy=0.0;
     for(nam=0;nam<28;nam++)
       {
        cl1=(Cluster *)malloc(sizeof(Cluster));cl2=(Cluster *)malloc(sizeof(Cluster));
        strcpy(filename1,name[nam]);strcpy(filename2,name[nam]);
        strcat(filename1,append1);strcat(filename2,append2);
        printf("File is %s %s\n",filename1,filename2);
        ReadPDB(filename1,cl1);ReadPDB(filename2,cl2);
        fre=0.00;occu=0.00;n1=0;n2=0;i=0;
      for(m1=0;m1<cl1->nchain;m1++) {ch1=cl1->Cincluster[m1];
        for(p1=ch1->Astart->next; p1; p1=p1->next) {
          for(m2=0;m2<cl2->nchain;m2++) {ch2=cl2->Cincluster[m2];
                for(p2=ch2->Astart->next; p2; p2=p2->next) {
             if(p1->alt >= 'A' && p1->alt == p2->alt) continue;
                dist=Distance(p1->x, p2->x);
                if(dist<2.6) {
                        printf("Distacne too small: %f\n",dist);
                } else {
                   i=(int)((dist*10-20)/2);
                   if(i<30) {
                     n1=AtomClass(p1->name, p1->res);
                     n2=AtomClass(p2->name, p2->res);
                     k=PairTypes(n1,n2);
                     occu=(p1->q)*(p2->q);
                     fre+=(potent[k][i-3])*(occu);
                   }
                }
           }
        }
     }g[nam]=fre;xs+=g[nam];ys+=yy[nam];
  printf("|j-value%d |jiaoer is %f for code %s\n",j,fre,filename1);
  release(cl1);release(cl2);
  free(cl1);free(cl2);
   }
  xm=xs/28;ym=ys/28;  for(li=0;li<28;li++){fm+=(g[li]-xm)*(yy[li]-ym);fzx+=(g[li]-xm)*(g[li]-xm);fzy+=(yy[li]-ym)*(yy[li]-ym);}
  r=fm/sqrt(fzx*fzy);b=fm/fzx;a=ym-b*xm;
  printf("COIEFFICIENT  %6.3f a %f b %f\n",r,a,b);
  if(r>rr){rr=r;jr=j;}
}
  printf("From -100 to 100 largest r is %f in %d",rr,jr);
  }


其中两个关键函数:
void ReadPDB(char *fname,Cluster *cl)
{
    FILE *f,*fopen();
    Atom *q,*p;
    Chain *ch;
//    Cluster *cl;
    char buf[limit],tmp[15],name[50],chain;
    int i,j,k,n=0;
                                                                                                                                    
                                                                                                                                    
    f=fopen(fname,"r");
/*    Pstart=(Atom *)malloc(sizeof(Atom));
    q=Pstart; q->next=NULL;*/
    j=0;k=0; chain='a';
//    cl=(Cluster *)malloc(sizeof(Cluster));
    cl->next=NULL;
    while(( i=FGetLine(f,buf) ) > -1) {
        if(strncmp(buf,"ATOM",4) == 0) {
            p=ReadATOM(buf);
//            if(ReadATOM(buf)) {
              if(p->chain!=chain){ ch=(Chain *)malloc(sizeof(Chain));ch->next=NULL;
              cl->Cincluster[n]=ch;
              if(n!=0)cl->Cincluster[n-1]->natom=k;n++;k=0;
              ch->Astart=(Atom *)malloc(sizeof(Atom));q=ch->Astart;q->next=NULL;
                                 }
              chain=p->chain;
                q->next=p; q=p; q->next=NULL; j++; k++;
//            }
        }
    }
                                                                                                                                    
    cl->Cincluster[n-1]->natom=k; cl->nchain=n;
    printf("The natom is %d\n",j);
    close(f);
}

void release(Cluster *cl)
{int m1;
Chain *ch1,*chq;
Atom *p1,*p1q;
                                                                                                                                    
for(m1=0;m1<cl->nchain;m1++) {ch1=cl->Cincluster[m1];
    for(p1=ch1->Astart->next; p1; p1=p1q){p1q=p1->next;free(p1);}
       free(ch1);}
}
回复 支持 反对

使用道具 举报

发表于 2005-3-13 11:04:46 | 显示全部楼层
贴代码请用[CODE]功能保持缩进,不然没有法看。
回复 支持 反对

使用道具 举报

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

本版积分规则

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