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 的结果按规则释放。
四 处理大目录与性能建议
五 排查清单