我正在创建一个由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;
}
srcList[]
中的条目时,请确保使用free()
释放它们。 - EOFstrdup
调用一次free
,迟早要这样做。 - M.M