在 Debian(以及所有类 Unix 系统)中使用 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); // 释放 opendir 分配的资源
return 0;
}
opendir() 返回的是什么opendir() 返回一个 DIR *✅ 正确方式:
closedir(dir);
❌ 错误方式:
free(dir); // 错误!不要直接 free
DIR *不是普通malloc出来的指针,不能free
closedir后果:
✅ 建议写法(防止异常路径漏关):
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return -1;
}
/* 使用目录 */
closedir(dir);
fdopendir()DIR *dir = fdopendir(fd);
...
closedir(dir);
⚠️ 注意:
closedir() 后,fd 也会被关闭close(fd)| 函数 | 作用 |
|---|---|
opendir() |
打开目录,分配资源 |
readdir() |
读取目录项 |
closedir() |
释放内存和文件描述符 |
✅ 在 Debian / Linux 下,opendir 的内存通过 closedir 释放,不要用 free
如果你有具体代码或 Valgrind 报的泄漏信息,我可以帮你具体分析。