双重免费或腐败的代码

时间:2014-04-07 19:40:08

标签: c memory double free

我的程序中有一个双重免费问题。我知道哪个指针是双重释放但我无法弄清楚它什么时候被释放。

这是我的函数代码:

int spectrum_gen(char *shift_r, char *rec_poly, char *redun_poly,int spectrum_length)
 {

char *seq = NULL,*l_shift = NULL,loop_shift[SIZE];
int current_weight,*spectrum = NULL,*spect_numb = NULL,length=1,spectrum_size=0;
int index,index2,temp,temp2,*temp3;
/* int *weights = NULL; */
int *encoded_w = NULL; 
int min_length,min_weight = 1000;
int looping = 0;
int **spectrum_content = NULL;
int *seq_w;
int *weight_table = symbols_weight(Q);
int *weights = NULL;

spectrum= (int*) malloc(sizeof(int));
seq = (char*) malloc(sizeof(char));
l_shift = (char*) malloc(SIZE*sizeof(char*));
weights = (int*) malloc(sizeof(int));
encoded_w = (int*) malloc(sizeof(int));
spect_numb = (int*) malloc(sizeof(int));
spectrum_content = (int**) malloc(sizeof(int*));
spectrum_content[1] = (int*) malloc(sizeof(int));
seq_w = (int*) malloc(sizeof(int));

strcpy(seq,"1");
convert_to_real(seq,1);

 while(length > 0)
{
      /* show_word(seq,length); 
      show_word(shift_r,SIZE);
     puts("");  */

    if(length == 1)
    {   
        set2zero(shift_r,SIZE);
        current_weight = RTZ_weight(0,seq[0],shift_r,rec_poly,redun_poly,encoded_w,seq_w,weight_table); 
        *seq_w += seq_weight(seq,1,weight_table);
    }
    else
    {   
        current_weight = RTZ_weight(weights[length-2],seq[length-1],shift_r,rec_poly,redun_poly,encoded_w,seq_w,weight_table);
        *seq_w += seq_weight(seq,length,weight_table);
    /*  show_word(shift_r,SIZE);
        show_word(loop_shift,SIZE); */
        if(looping==1 && str_cmp(shift_r,loop_shift,SIZE))
        {
            puts("looping sequence!!");

            free(spectrum);
            spectrum = NULL;


            free(encoded_w);
            encoded_w = NULL;


            free(spect_numb);
            spect_numb = NULL;


            free(spectrum_content);
            spectrum_content = NULL;

            free(weights);
            weights = NULL;

            return 1;
            break;
        }

        if(*encoded_w==weights[length-2] && looping==0 && length>3)
        {
            str_cpy(loop_shift,shift_r,SIZE);
            looping = 1;
        }

        if(*encoded_w != weights[length-2]) 
        {
            looping = 0;
        }   
    }

    weights = realloc(weights,length*sizeof(int));
    weights[length-1] = *encoded_w;
    l_shift = realloc(l_shift,length*sizeof(char));
    l_shift[length-1] = shift_r[SIZE-1];


    if((shift_r[0] != 0) && (*encoded_w < spectrum_length))
    {   

        if((temp = index4(current_weight,spectrum,spectrum_size,1,0)) != (-1))
        {
            spect_numb[temp]++;
            if((temp2 = index4(*seq_w,spectrum_content[temp],spectrum_content[temp][0],2,1)) != (-1))
            {   spectrum_content[temp][temp2+1]++;
            }
            else
            {
                spectrum_content[temp][0] += 2; 
                spectrum_content[temp] =  realloc(spectrum_content[temp],spectrum_content[temp][0]*sizeof(int));
                spectrum_content[temp][spectrum_content[temp][0]-2] = *seq_w;
                spectrum_content[temp][spectrum_content[temp][0]-1] = 1;
            } 
        }
        else 
        {
            spectrum_size++;
            spectrum = realloc(spectrum,spectrum_size*sizeof(int));
            spect_numb = realloc(spect_numb,spectrum_size*sizeof(int));
            /* spectrum content : creation of a new table to store the inputs with output of weight current_weight*/
            spectrum_content = realloc(spectrum_content,spectrum_size*sizeof(int*));
            spectrum_content[spectrum_size-1] = (int*) malloc(3*sizeof(int));
            spectrum_content[spectrum_size-1][0] = 3;
            spectrum_content[spectrum_size-1][1] = *seq_w;
            spectrum_content[spectrum_size-1][2] = 1;

            spectrum[spectrum_size-1] = current_weight;
            spect_numb[spectrum_size-1] = 1;
        }   
    }

    if(seq_equal_zero(shift_r,SIZE) || (*encoded_w >= spectrum_length))
    {   
        while((length>0) && (seq[length-1] == Q-1)) 
        {
            length--;
            for(index=0;index<SIZE-1;index++)   
                shift_r[index] = shift_r[index+1];
            shift_r[SIZE-1] = l_shift[length-1];
        }
            for(index=0;index<SIZE-1;index++)   
                shift_r[index] = shift_r[index+1];
            shift_r[SIZE-1] = l_shift[length-2];
        seq[length-1] += 1; 
    }

    else
    {
        length++;
        seq = realloc(seq,length*sizeof(char));
        seq[length-1] = 0;
    }
        /* printf("%d\n%d\n",*encoded_w,current_weight); 
         getchar(); */
} 
/* sort(spectrum,spect_numb,spectrum_content,spectrum_size);*/
puts("Debut du spectre de ce codeur :");
for(index=0;spectrum[index+1]<=spectrum_length;index++)
{
     printf("( "); 
    for(index2=1;index2<spectrum_content[index][0]-2;index2+=2)
    {
        printf("%d*I^%d + ",spectrum_content[index][index2+1],spectrum_content[index][index2]);
    }
    printf("%d*I^%d",spectrum_content[index][spectrum_content[index][0]-1],spectrum_content[index][spectrum_content[index][0]-2]);
    printf(" )*O^%d + ",spectrum[index]);
}

    printf("( "); 
    for(index2=1;index2<spectrum_content[index][0]-2;index2+=2)
    {
        printf("%d*I^%d + ",spectrum_content[index][index2+1],spectrum_content[index][index2]);
    }
    printf("%d*I^%d",spectrum_content[index][spectrum_content[index][0]-1],spectrum_content[index][spectrum_content[index][0]-2]);
    printf(")*O^%d",spectrum[index]);
    puts(""); 

free(seq);
    seq = NULL;

free(spectrum);
spectrum = NULL;

free(encoded_w);
encoded_w = NULL;


free(spect_numb);
spect_numb = NULL;


free(spectrum_content);
spectrum_content = NULL;

free(weights);
weights = NULL;
return 0;   
  }

该指针名为seq。

如果有人帮我解决这个问题会很酷:)

这是处理该指针的两个函数

 void convert_to_real(char *word,int end)
 {
int index;
for(index=0;index<end;index++) word[index]-='0';
 }

我不认为这可能是个问题 处理该指针的唯一其他函数是:

int seq_weight(char *seq,int end,int *weight_table)
  {
   int index,weight = 0;
   for(index=0;index<end;index++)
    if(seq[index]>=0 && seq[index]<Q) 
        weight += weight_table[(int)seq[index]];
return weight;
   }

我不认为这也不会引起问题。 :(

1 个答案:

答案 0 :(得分:-2)

在释放它之后将指针值设置为null非常棒。所以要利用这个事实,并在释放之前检查null - 这样就可以避免双重删除。然后你不必寻找双重删除,因为你将受到保护。

相关问题