在 Debian(以及 Linux 一般) 里,readdir 本身不会“一直涨内存”,但用错方式很容易造成内存泄漏或缓存增长。下面按常见情况给你一个清晰说明。
readdir 本身的内存行为(正常情况)readdir()(传统接口)#include <dirent.h>
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 使用 entry->d_name
}
closedir(dir);
✅ 正确使用时:
readdir() 返回的是 静态内部缓冲区❌ 错误用法:
char *name = strdup(entry->d_name); // 忘了 free
➡ 这是用户代码泄漏,不是 readdir 的问题。
readdir_r()(已废弃)✅ 建议:用 readdir() 就够了
readdir 本身没问题free -h
你会看到:
buff/cache 变大✅ 这是正常行为
DIR *dir = opendir(".");
// 忘了 closedir(dir);
➡ 会造成:
✅ 一定要:
closedir(dir);
readdir 结果长期保存struct dirent de;
struct dirent *entry;
readdir_r(dir, &de, &entry);
list_add(entry); // ❌
❌ entry 是内部指针
✅ 正确做法:
strdup(entry->d_name);
readdir 会触发大量 dentry / inode 缓存slab 内存增长查看:
slabtop
cat /proc/meminfo | grep -i slab
✅ 这是内核缓存,不是 bug
/proc/meminfo 看的是宿主机free 不准readdir 后 cache 看起来像“内存泄漏”✅ 正常现象
valgrindvalgrind --leak-check=full ./your_program
✅ 如果 readdir 本身泄漏,valgrind 会直接指出
free -h
cat /proc/meminfo
| 类型 | 说明 |
|---|---|
| buff/cache | 正常 |
| slab | 内核缓存 |
| anon | 用户态泄漏 |
✅ readdir 本身不会内存泄漏
✅ Debian 下内存涨通常是:
closedirdirent 指针如果你愿意,可以把:
发出来,我可以精确判断是哪一种情况。