在 Debian(或者说 Linux 下 C/C++ 程序)里,readdir 相关的内存释放,主要取决于你用的是 哪个函数。
下面分情况说明:
opendir + readdir(最常见)#include <dirent.h>
DIR *dir = opendir("/path");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 使用 entry->d_name
}
closedir(dir);
readdir() 返回的结构体由 DIR 内部管理free(entry)closedir(dir);
closedir 会释放 opendir 分配的内存✅ 结论:
readdir本身不需要手动释放,closedir就够了
readdir_r(线程安全版本,已不推荐)struct dirent entry;
struct dirent *result;
readdir_r(dir, &entry, &result);
entry 是你自己定义的栈变量freeclosedir(dir);
⚠️ 注意:
readdir_r 在 glibc 2.34+ 已被标记为废弃
scandir(会分配内存)struct dirent **namelist;
int n = scandir("/path", &namelist, NULL, alphasort);
for (int i = 0; i < n; i++) {
free(namelist[i]);
}
free(namelist);
✅ 必须两层释放
namelist[i]:scandir 内部 mallocnamelist:数组本身getdents(底层系统调用)syscall(SYS_getdents, fd, buf, size);
buf 是你自己 malloc 的free(buf)close(fd)| 函数 | 是否需 free entry | 释放方式 |
|---|---|---|
| readdir | ❌ | closedir |
| readdir_r | ❌ | closedir |
| scandir | ✅ | free 每一项 + free 数组 |
| getdents | ✅ | free buf + close |
如果你愿意,可以把你的 代码片段 发出来,我可以帮你精确看有没有内存泄漏风险。