утечка памяти с повторным использованием strdup по


Я создаю массив имен файлов, полученных из структуры 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) после последнего использования массива освобождает только память, выделенную strdup/malloc для последнего экземпляра d_entry.

Вальгринд подтверждает память утечка.

Есть ли способ справиться с этим или я должен посмотреть на использование say 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;
   }
1 3

1 ответ:

Как обсуждалось в комментариях, утечка исправлена с помощью

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

Когда массив больше не нужен