在 Ubuntu(Linux)下使用 readdir 读取目录时,所谓的“释放资源”主要涉及 打开的目录流(DIR)* 和 遍历过程中的资源清理。下面按常见情况说明。
readdir 依赖 opendir 返回的 DIR* 目录流,必须用 closedir 释放。
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir); // 释放目录资源
return 0;
}
✅ 关键点
opendir → readdir → closedirreaddir 返回的 struct dirent * 不需要手动 free不需要。
readdir 返回的指针指向 目录流内部缓冲区readdir 会覆盖它free(entry)❌ 错误示例:
free(entry); // 错误!
如果你用的是 readdir_r:
struct dirent entry;
struct dirent *result;
while (readdir_r(dir, &entry, &result) == 0 && result != NULL) {
printf("%s\n", entry.d_name);
}
✅ 特点:
struct direntclosedir(dir)DIR *dir = opendir(".");
readdir(dir);
// 忘记 closedir(dir);
结果:文件描述符泄漏
DIR *dir = opendir(path);
if (!dir) return;
if (some_error) {
closedir(dir);
return;
}
如果你用 C++,可以用 std::unique_ptr 或封装类:
#include <dirent.h>
#include <memory>
struct DirCloser {
void operator()(DIR* d) const { if (d) closedir(d); }
};
using DirPtr = std::unique_ptr<DIR, DirCloser>;
| 资源 | 是否需释放 | 方法 |
|---|---|---|
| DIR* | ✅ 必须 | closedir(dir) |
| struct dirent* | ❌ 不需要 | 下次 readdir 覆盖 |
| 文件描述符 | ✅ 间接 | 由 closedir 处理 |
如果你是在 Android / glibc / musl 或 多线程环境 下用 readdir,可以告诉我,我可以给更具体的建议。