2013-11-16 2 views
12

Следующая часть моего кода дает мне этот messege при выполнении * Glibc обнаружен ./a.out: двойной бесплатно или повреждения (fasttop): 0x08e065d0 * *двойные бесплатно или повреждение (fasttop)

Я прошел через код много раз, но я не могу clealry видеть, как я злоупотребляя free (temp2)

bool found= false; 
int x=0; 
for (x=0; x<=312500; x++) 
{ 
    while (count <=32) 
    { 
     fscanf (file, "%d", &temp->num); 

     temp->ptr=NULL; 

     newNode = (NODE *)malloc(sizeof(NODE)); 
     newNode->num=temp->num; 
     newNode->ptr=NULL; 

     if (first != NULL) 
     { 
      temp2=(NODE *)malloc(sizeof(NODE)); 

      temp2=first; 
      while (temp2 != NULL && !found) 
      { 
       if (temp2->num == newNode->num) 
       {found=true;} 

       temp2= temp2->ptr; 
      } 

      free(temp2); 

      if (!found) 
      { 
       last->ptr=newNode; 
       last=newNode; 
       count=count+1; 
      } 
     } 
     else 
     { 
      first = newNode; 
      last = newNode; 
      count=count+1; 
     } 

     fflush(stdin); 
    } 
+0

Что такое _purpose_ этого фрагмента программы? BTW: 'temp2 = (NODE *) malloc (sizeof (NODE)); temp2 = first; 'будет в меньшей мере утечка памяти. – wildplasser

+0

Вы должны проверить (first-> ptr)! = NULL – user1584773

+0

fflush имеют неопределенное поведение. Если вы хотите удалить данные на stdin, прочитайте их и отбросьте, но избегайте использования fflush. – Abhineet

ответ

12

проблема здесь:

 temp2=first; 

В основном, когда вы бесплатно temp2, вы бесплатно первый, не память, выделенная здесь:

 temp2=(NODE *)malloc(sizeof(NODE)); 

, который остается утечка памяти, потому что после назначения он не может быть освобожден больше.

Кроме того, ваш код имеет, вероятно, еще несколько проблем (один из них заключается в том, что вы не должны использовать fflush на входном потоке), но без каких-либо подробностей невозможно сказать.

+4

@Abhineet ['fflush()'] (http://en.cppreference.com/w/c/io/fflush) имеет * много * определенного поведения. Flushing * 'stdin' * (или любой поток без вывода) - это то место, где определение исчезает, поэтому, возможно, возьмите царство точности, если вы собираетесь сказать людям, что« fflush »имеет неопределенное поведение». – WhozCraig

+0

@Abhineet: Я не думаю, что Paul92 предназначался; для меня это похоже, что он просто сделал опечатку. Он хотел написать * не должен *, но не попал в 'n'. Итак, что вышло, это * should't *, который вы читаете как * должен *. – Multisync