温馨提示×

linux readdir内存怎么释放

小樊
48
2026-09-20 22:46:29
栏目: 智能运维

在 Linux 下使用 readdir()(或 readdir_r())读取目录时,内存释放方式取决于你用的函数和实现。下面分情况说明。


一、使用 opendir + readdir(最常见)

#include <dirent.h>

DIR *dir = opendir("/path");
struct dirent *entry;

while ((entry = readdir(dir)) != NULL) {
    // 使用 entry->d_name
}

closedir(dir);

内存怎么释放?

✅ 不需要手动释放 readdir 返回的 struct dirent *

原因:

  • readdir() 返回的指针 指向 DIR 内部缓冲区
  • 该内存由 opendir() 分配,closedir() 释放
  • 每次调用 readdir() 都会覆盖同一块内存

⚠️ 千万不要:

free(entry);   // ❌ 错误,会导致 double free 或崩溃

正确做法

closedir(dir);  // ✅ 释放所有相关内存

二、如果你复制了文件名

如果你把 d_name 存起来用:

char *name = strdup(entry->d_name);

那你需要:

free(name);

三、使用 readdir_r(线程安全版本,已不推荐)

struct dirent entry;
struct dirent *result;

readdir_r(dir, &entry, &result);

内存说明

  • entry 是你自己分配的(栈上)
  • 不需要 free
  • 只 closedir(dir)

四、使用 scandir(一次性读取)

struct dirent **namelist;
int n = scandir("/path", &namelist, NULL, alphasort);

内存释放方式

for (int i = 0; i < n; i++) {
    free(namelist[i]);
}
free(namelist);

✅ scandir 必须手动释放


五、常见错误总结

情况 是否需要 free
readdir() 返回值 ❌ 不需要
opendir() 资源 ✅ closedir()
strdup(entry->d_name) ✅ 需要
scandir() 结果 ✅ 需要

六、一句话总结

readdir() 返回的内存由 closedir() 统一管理,不要 free;只有你额外 malloc/strdup 的才需要释放。

如果你有具体代码,我可以帮你检查有没有内存问题。

0 踩