我知道如何使用 malloc()
和 free()
来分配内存,但是是否还有一个标准的 C 函数来检查剩余的内存量,所以我可以定期调用它以确保我的代码没有内存泄漏吗?
我唯一能想到的就是在无限循环中调用malloc(1)
直到它返回一个错误,但是难道没有更有效的方法吗?
最佳答案
Linux glibc sysconf(_SC_AVPHYS_PAGES)
和 get_avphys_pages()
这两个 glibc 扩展应该给你可用的页数。然后我们可以将它乘以页面大小 sysconf(_SC_PAGESIZE)
以找到以字节为单位的总可用内存。
主.c
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/sysinfo.h>
#include <unistd.h>
int main(void) {
/* PAGESIZE is POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/
* but PHYS_PAGES and AVPHYS_PAGES are glibc extensions. I bet those are
* parsed from /proc/meminfo. */
printf(
"sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) = 0x%lX\n",
sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE)
);
printf(
"sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE) = 0x%lX\n",
sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE)
);
/* glibc extensions. man says they are parsed from /proc/meminfo. */
printf(
"get_phys_pages() * sysconf(_SC_PAGESIZE) = 0x%lX\n",
get_phys_pages() * sysconf(_SC_PAGESIZE)
);
printf(
"get_avphys_pages() * sysconf(_SC_PAGESIZE) = 0x%lX\n",
get_avphys_pages() * sysconf(_SC_PAGESIZE)
);
}
编译运行:
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
我的 32GiB RAM 系统上的示例输出:
sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) = 0x7CCFFC000
sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE) = 0x6383FD000
get_phys_pages() * sysconf(_SC_PAGESIZE) = 0x7CCFFC000
get_avphys_pages() * sysconf(_SC_PAGESIZE) = 0x6383FD000
0x7CCFFC000 比 32GiB 小一点,是总 RAM。 0x6383FD000 是可用的。
man get_avphys_pages
说它从 /proc/meminfo
获取数据。
在 Ubuntu 19.04 中测试。
关于C - 检查当前可用的空闲 RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14386856/