2017-04-11 5 views
-1

Valgrindは、この関数にメモリリークがありますが、それを見つけることができないと主張しています。これは、cのリンクリストを使用したセット実装の一部です。Cリンクリストを使用した実装の設定メモリリーク

int set_add(set * s,int e[2]){ 
     if(set_empty(*s)) { 
       element * new=malloc(sizeof (element)); 
       new->coord[0]=e[0]; 
       new->coord[1]=e[1]; 
       new->next =NULL; 
       s->head=new; 
       return 1; 
     } 
     element * current=s->head; 
     while(current != NULL) { 
       if(coord_equal(current->coord,e)) { 
         return 0; 
       } 
       if(current->next ==NULL){ 
        break; 
       } 
       current=current->next; 
     } 
     element * new=malloc(sizeof (element)); 
     new->coord[0]=e[0]; 
     new->coord[1]=e[1]; 
     new->next = NULL; 
     current->next=new; 
     return 1; 
} 
+1

'while(current!= NULL)' ... 'current-> next = new; 'です。最後の行で 'current'がNULLであるように見えます。 – kaylum

+0

current-> nextがnullのときにブレークしないため、現在の値はnullではなく、1つの要素だけを含むセットがチェックされるようにコード化されています –

答えて

-1

私が行うには正しいことが確かにそれが割り当てられたとされていない場合、あなたはそのメモリ領域を解放し、機能を終了する必要がある場合は、それぞれのmallocの後に確認してくださいだと思います。このような

何か:

value = malloc(); 
if (value){ 
//value was allocated correctly 
//do the things you want with it 
free(value); 
} 
else{ 
return 0; //exit your function 
} 

は、この情報がお役に立てば幸いです。

+0

'malloc'が失敗した場合、' free'が必要なのはなぜですか?意味がありません。 – kaylum

+0

ああ、申し訳ありませんが、私はあなたの価値を尽くした後、それを自由にすべきだと言っています。もし、ifの終わりのように、私は今、それを編集しています。 –

+0

それはOPを助けません。後で使用するために新しい要素を割り当てる関数のポイント。だから、そのコードに 'free'を持たせることは意味しません。 – kaylum

関連する問題