温馨提示×

ubuntu copendir如何正确释放

小樊
39
2026-09-17 19:46:03
栏目: 智能运维

在 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;
}

关键点说明

  1. opendir 返回的是 DIR *

    • 成功:返回有效指针
    • 失败:返回 NULL
  2. 必须用 closedir() 关闭

    int closedir(DIR *dirp);
    
    • 失败返回 -1,可用 perror() 查看原因
    • 不要对 NULL 调用 closedir()
  3. 错误示例(❌ 错误)

    DIR *dir = opendir("/tmp");
    free(dir);   // 错误!不能用 free
    

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

  4. 重复关闭也不行

    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++异常安全多线程环境 下使用,我也可以给你更安全的封装示例。

0