You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sysconf()无法获取可用内存,Ubuntu下C++如何读取实时可用内存

分配数组后sysconf返回内存值无变化的原因
  • 你调用sysconf时传入的_SC_PHYS_PAGES参数本身代表的是系统总物理内存对应的页数,乘以_SC_PAGE_SIZE得到的是整机固定的总物理内存容量,和进程是否分配内存完全无关,所以两次打印的结果自然不会有变化。
  • 即使你更换为查询可用页的参数_SC_AVPHYS_PAGES,也可能出现分配后数值未立刻下降的情况:Linux默认开启内存过度提交机制,用户态申请内存时内核只会先预留虚拟地址空间,只有当你实际对内存页执行写入操作时,才会真的分配物理内存。就算代码中用()做了零值初始化,也可能因为编译器优化、内核延迟分配的逻辑,出现物理页未立刻分配的情况。
Ubuntu下C++获取系统实时可用内存的方法

Ubuntu作为Linux发行版,最准确的实现方式是读取/proc/meminfo伪文件,其中的MemAvailable字段是内核实时计算的可用内存,包含空闲内存、可回收的缓存和缓冲页,完全符合实际使用的可用内存定义。
注意计算数组大小时要把数值转换为长整型,避免32位整数溢出,以下是示例实现代码:

#include <fstream>
#include <string>
#include <iostream>
#include <unistd.h>

unsigned long long get_available_mem() {
    std::ifstream meminfo("/proc/meminfo");
    std::string line;
    unsigned long long available_kb = 0;
    while (std::getline(meminfo, line)) {
        if (line.substr(0, 13) == "MemAvailable:") {
            sscanf(line.c_str(), "MemAvailable: %llu kB", &available_kb);
            break;
        }
    }
    // 转换为字节返回,不需要可以直接返回kb单位
    return available_kb * 1024;
}

int main() {
    std::cout << "可用内存:" << get_available_mem() << " 字节\n";
    int* g = new int[2000000000]();
    std::cout << "数组大小:" << 2000000000LL * sizeof(int) << " 字节\n";
    sleep(1);
    std::cout << "分配后可用内存:" << get_available_mem() << " 字节\n";
    delete[] g;
    return 0;
}

内容的提问来源于stack exchange,提问作者alvrm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:03:00