在 CentOS(以及一般的 Linux/glibc 环境)里,readdir 相关资源释放主要取决于你用的是 哪种目录遍历方式。下面分情况说明。
opendir + readdir + closedir这是最传统、最常见的方式。
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/path/to/dir");
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 → 打开目录,返回 DIR *readdir → 不需要手动释放,返回的是 DIR 内部缓冲区closedir(dir) → ✅ 必须调用,释放文件描述符和内存⚠️ 忘记 closedir 会导致文件描述符泄漏
readdir_r(线程安全版本,已过时)DIR *dir = opendir("/path");
struct dirent entry;
struct dirent *result;
readdir_r(dir, &entry, &result);
closedir(dir);
entry 是你自己分配的栈变量 → 不需要释放closedir(dir)scandir(一次性读取整个目录)struct dirent **namelist;
int n = scandir("/path", &namelist, NULL, alphasort);
for (int i = 0; i < n; i++) {
free(namelist[i]); // ✅ 每个 entry
}
free(namelist); // ✅ 数组本身
getdents(系统调用,低级)getdents 返回的是你自己的 bufferfree(buffer)open 打开,用 close 关闭| 错误 | 后果 |
|---|---|
忘记 closedir |
文件描述符泄漏 |
对 readdir 返回值 free |
未定义行为 |
scandir 后没 free |
内存泄漏 |
多线程中误用 readdir |
数据竞争 |
readdir 内部线程安全(glibc ≥ 2.0)DIR *如果你能贴出具体代码或说明是 C / C++ / shell / Python,我可以更精确地告诉你该怎么释放。