在 Ubuntu(Linux)下使用 C/C++ 的 opendir() 打开目录后,必须调用 closedir() 来正确释放资源,否则会造成文件描述符泄漏。
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/tmp");
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
// 正确释放
closedir(dir);
return 0;
}
opendir 返回的是 DIR *
NULL必须用 closedir() 关闭
int closedir(DIR *dirp);
-1,可用 perror() 查看原因NULL 调用 closedir()错误示例(❌ 错误)
DIR *dir = opendir("/tmp");
free(dir); // 错误!不能用 free
DIR *不是malloc出来的普通内存,不能用free
重复关闭也不行
closedir(dir);
closedir(dir); // 未定义行为 / 可能崩溃
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return -1;
}
// 使用 dir
...
if (closedir(dir) != 0) {
perror("closedir");
}
opendir() → 打开目录readdir() → 读取目录项rewinddir() → 重置读取位置closedir() → 释放目录流 ✅如果你是在 C++、异常安全 或 多线程环境 下使用,我也可以给你更安全的封装示例。