我的程序有一个双重自由问题。我知道哪个指针是双重释放的,但我不知道它是什么时候首先释放的。
以下是我的函数代码:

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;
   }

我认为这也不会造成问题。:(

最佳答案

在释放指针值之后,将其设置为空是很好的。所以,利用这个事实,在释放它之前检查null,这样就避免了双重删除。那么你就不必去寻找双重删除,因为你会受到保护。

关于c - 具有双重释放或损坏的代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22921541/

10-12 16:09