温馨提示×

Ubuntu copendir内存如何释放

小樊
39
2026-08-02 20:36:12
栏目: 智能运维

在 Ubuntu(Linux)下,opendir() 打开的目录流必须显式释放,否则会造成文件描述符泄漏

正确释放方式

#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*
readdir() 读取目录项
closedir() 释放资源(必须调用)

常见误区

  1. 只 free() 不 closedir() ❌

    free(dir);  // 错误!会导致 fd 泄漏
    

    DIR* 不是普通 malloc 出来的内存,不能用 free()

  2. 忘记 closedir() ❌

    • 会导致:
      • 文件描述符耗尽
      • 程序运行一段时间后报错:Too many open files
  3. 重复 closedir() ❌

    closedir(dir);
    closedir(dir);  // 可能导致崩溃或 undefined behavior
    

如何确认是否泄漏?

lsof -p <pid>

cat /proc/<pid>/fd

总结一句话

opendir() 后一定要 closedir(),不要 free()

如果你是在 C++ / 多线程 / 长时间运行服务 中遇到这个问题,也可以贴代码,我可以帮你检查是否有隐藏泄漏。

0