重复 strdup 的内存泄漏
memory leak with repeated strdup's
我正在创建一个从 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 的最后一个实例分配的内存。
Valgrind 确认内存泄漏。
有没有办法处理这个问题,或者我应该看看在数组中创建指针之前使用 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;
}
正如评论中所讨论的,漏洞已由
修复
for ( i=0; i< size;i++)
free( srcList[i] );
当数组不再需要时
我正在创建一个从 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 的最后一个实例分配的内存。
Valgrind 确认内存泄漏。
有没有办法处理这个问题,或者我应该看看在数组中创建指针之前使用 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;
}
正如评论中所讨论的,漏洞已由
修复for ( i=0; i< size;i++)
free( srcList[i] );
当数组不再需要时