2012-01-21 10 views
0
for(k=i; k<MAXRECORDS; k++) { 
    if(slist->servers_ptr[k+1] != NULL) { 
     slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
    } else slist->servers_ptr[k] = NULL; 
} 

私はvalgrindの実行すると、私はMAXRECORDS = 10、配列のサイズはMAXRECORDSであることを無効なサイズ8forループのメモリリークの原因は何ですか?

ノートのエラーを取得します。

これは私のforループの境界線の場合と関係がありますが、論理的にどのように起こっているのか分かりません。

編集:forループの最後のラウンドで、servers_ptr[k+1]にアクセスすると配列外になり、valgrindエラーが発生することが指摘されました。私は以来私のコードを更新しました:

for(k=i; k<MAXRECORDS-1; k++) { 
    if(slist->servers_ptr[k+1] != NULL) { 
      slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
      if(k==MAXRECORDS-2)slist->servers_ptr[k+1] = NULL; 
    } else slist->servers_ptr[k] = NULL; 
} 

私はまだvalgrindでエラーが発生します。私はそれを間違って更新しましたか?

+0

次に私の答えは正しいです。 –

+0

あなたはここで 'malloc'や' realloc'をやっていません。あなたは本当にこのコードでいくつかのメモリリークの問題があると思いますか?私は問題があなたがメモリを割り当てている他のコードスニペットであるかもしれないと思います。 – c0da

+0

明らかに間違っていることはありません。 valgrindから得た正確なエラーを投稿できますか? –

答えて

3

servers_ptrは、サイズMAXRECORDSである。あなたのforループのこの最後の反復では、k == MAX_RECORDS - 1servers_ptr[k+1]にアクセスします。これはservers_ptr[MAX_RECORDS]になります。これは、配列の末尾を1つ超えています。これは未定義の振る舞いであり、valgrindはそれにフラグを立てます。

  for(k=i; k<MAXRECORDS; k++) { 
        if(slist->servers_ptr[k+1] != NULL) { 
          slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
        } else slist->servers_ptr[k] = NULL; 
      } 

このelse節を考慮してください。同じもの:

slist->servers_ptr[k] = slist->servers_ptr[k+1]; 

slist->server_ptr[k+1]は、if条件に失敗したためNULLであることがわかっています。しかし、これは、ifの両方の枝が同じであることを意味します。だから、コードは同等です:

[1][2][3][4][5] 
[2][3][4][5][?] 

あなたのコードは、多くの1つの値をシフトしようと引っ張って終わる:

  for(k=i; k<MAXRECORDS; k++) { 
       slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
      } 

だから、何をやっていることは、このように左へのすべてのポインタをシフトしていますどこかからのゴミ。

解決策は、1つ少ないアイテムをコピーして、最後のセルを特殊なケースとして扱うことです。

  for(k=i; k<MAXRECORDS-1; k++) { 
       slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
      } 
      slist->servers_ptr[MAXRECORDS-1] = NULL; 
+0

大きな説明。私はこれを試してみましょう、ありがとう! –

関連する問題