debian

debian readdir内存管理技巧

小樊
33
2025-12-18 11:33:26
栏目: 智能运维

Debian 下 readdir 内存管理要点

一 核心原则

二 常见误区与正确做法

三 代码示例

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main(int argc, char *argv[]) {
    const char *path = argc > 1 ? argv[1] : ".";
    DIR *dir = opendir(path);
    if (!dir) { perror("opendir"); return EXIT_FAILURE; }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        // 直接使用 entry->d_name;不要 free(entry)
        printf("%s\n", entry->d_name);
    }

    closedir(dir);
    return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

int main(int argc, char *argv[]) {
    const char *path = argc > 1 ? argv[1] : ".";
    DIR *dir = opendir(path);
    if (!dir) { perror("opendir"); return EXIT_FAILURE; }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        char *name_copy = strdup(entry->d_name);
        if (!name_copy) { perror("strdup"); continue; }

        // 使用 name_copy
        printf("copy: %s\n", name_copy);

        free(name_copy);  // 关键:释放你自己的拷贝
    }

    closedir(dir);
    return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main(int argc, char *argv[]) {
    const char *path = argc > 1 ? argv[1] : ".";
    struct dirent **namelist = NULL;
    int n = scandir(path, &namelist, NULL, alphasort);
    if (n < 0) { perror("scandir"); return EXIT_FAILURE; }

    for (int i = 0; i < n; i++) {
        printf("%s\n", namelist[i]->d_name);
        free(namelist[i]);  // 先释放每个条目
    }
    free(namelist);         // 再释放数组本身
    return EXIT_SUCCESS;
}

以上示例体现了:对 readdir 的条目指针不要 free,对你自己分配的副本或 scandir 的结果按规则释放。

四 处理大目录与性能建议

五 排查清单

0
看了该问题的人还看了