3

linux_dirent 構造体 (d) から取得したファイル名の配列を作成しています。ループの各反復で、ファイル名は次を使用して取得されます

d_entry = strdup(d->d_name);

これへのポインタが配列に追加されます。

srcList[aSz] = d_entry;

ポインターの配列には、指す有効なメモリが必要なため、これを行うことはできません。

d_entry = strdup(d->d_name);
srcList[aSz] = d_entry;
free(d_entry);

配列を最後に使用しfree(d_entry)た後に使用すると、d_entry の最後のインスタンス用に strdup/malloc によって割り当てられたメモリのみが解放されます。

Valgrind はメモリ リークを確認します。

これに対処する方法はありますか、または memcpy を使用してファイル名を別のバッファーに移動してから、配列にポインターを作成することを検討する必要があります。

コアループ:

   for (bpos = 0; bpos < nread;) {
       d = (struct linux_dirent *) (buf + bpos);
       d_type = *(buf + bpos + d->d_reclen - 1);
       if( d->d_ino != 0 && d_type == DT_REG || d_type == DT_UNKNOWN ) {

           /* get directory entry */
            d_entry = strdup(d->d_name); // << repeat allocations here

           /* save pointer to filename in array 'srcList' */
                srcList[aSz] = d_entry;
                aSz++;
       }
       if ( aSz == DAY_COUNT +1 ) break;
       bpos += d->d_reclen;
   }
4

1 に答える 1

1

コメントで説明されているように、リークは次の方法で修正されます

for ( i=0; i< size;i++)
   free( srcList[i] );

配列が不要になったとき

于 2016-02-23T10:24:11.707 に答える