在 Linux 下使用 readdir()(或 readdir_r())读取目录时,内存释放方式取决于你用的函数和实现。下面分情况说明。
opendir + readdir(最常见)#include <dirent.h>
DIR *dir = opendir("/path");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 使用 entry->d_name
}
closedir(dir);
✅ 不需要手动释放 readdir 返回的 struct dirent *
原因:
readdir() 返回的指针 指向 DIR 内部缓冲区opendir() 分配,closedir() 释放readdir() 都会覆盖同一块内存⚠️ 千万不要:
free(entry); // ❌ 错误,会导致 double free 或崩溃
closedir(dir); // ✅ 释放所有相关内存
如果你把 d_name 存起来用:
char *name = strdup(entry->d_name);
那你需要:
free(name);
readdir_r(线程安全版本,已不推荐)struct dirent entry;
struct dirent *result;
readdir_r(dir, &entry, &result);
entry 是你自己分配的(栈上)freeclosedir(dir)scandir(一次性读取)struct dirent **namelist;
int n = scandir("/path", &namelist, NULL, alphasort);
for (int i = 0; i < n; i++) {
free(namelist[i]);
}
free(namelist);
✅ scandir 必须手动释放
| 情况 | 是否需要 free |
|---|---|
readdir() 返回值 |
❌ 不需要 |
opendir() 资源 |
✅ closedir() |
strdup(entry->d_name) |
✅ 需要 |
scandir() 结果 |
✅ 需要 |
readdir()返回的内存由closedir()统一管理,不要 free;只有你额外malloc/strdup的才需要释放。
如果你有具体代码,我可以帮你检查有没有内存问题。