【问题标题】:Why doesn't the memory being used by a program change, when more memory allocations are done?当更多的内存分配完成时,为什么程序使用的内存没有改变?
【发布时间】:2021-07-13 00:35:58
【问题描述】:

我有以下程序:

int main(int argc,char **argv){
  double*a;
  double*b;
  double*c;
  double*d;
  double*e;
  double*f;
  double*g;
  double*h;
  double*i;
  double*j;
  double*k;
  double*l;
  double*m;
  double*n;
  double*o;
  double*p;
  double*q;
  while(1){
    a=malloc(1000000*1000000000000*sizeof(double));
    b=malloc(1000000*1000000000000);
    c=malloc(1000000*1000000000000);
    d=malloc(1000000*1000000000000);
    e=malloc(1000000*1000000000000);
    f=malloc(1000000*1000000000000);
    g=malloc(1000000*1000000000000);
    h=malloc(1000000*1000000000000);
    i=malloc(1000000*1000000000000);
    j=malloc(1000000*1000000000000);
    m=malloc(1000000*1000000000000);
    n=malloc(1000000*1000000000000);
    o=malloc(1000000*1000000000000);
    p=malloc(1000000*1000000000000);
    q=malloc(1000000*1000000000000);
  }
}

任务管理器发出以下内存使用情况:

然后,我将程序更改为

int main(int argc,char **argv){
  double*a;
  while(1){
    a=malloc(1000000*1000000000000*sizeof(double));
  }
}

编译,任务管理器显示:

第一个程序的内存使用率不应该更高吗?我在这里错过了什么?

【问题讨论】:

  • 您对malloc 的调用可能会失败(您在每个malloc 处都请求大量内存)。一些操作系统有memory overcommitment。典型的笔记本电脑和操作系统可以拥有processes,每个都使用几千兆字节!阅读dynamic memory management的文档,并使用valgrind
  • 就是这样,谢谢!
  • 某些操作系统可以在malloc() 上返回一个有效指针,但在您访问它之前不会真正占用空间。我曾经尝试malloc(),直到它返回NULL,它给了我比可用内存更多的内存。经验教训:这样的基准并非微不足道。
  • 我会打印出指针。很有可能它们都是空指针,因为您的计算机没有一百万 TB 作为虚拟内存的后备存储。

标签: c memory


【解决方案1】:

像 glibc 内存分配器这样的内存分配器有内存限制。这意味着进行大量分配可能最终导致分配失败。在这种情况下会返回一个 NULL 指针。

查看这些 malloc 的返回值以了解发生了什么,但很明显请求太长而无法分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2016-02-16
    • 2011-03-31
    • 2020-07-18
    • 1970-01-01
    • 2015-12-03
    相关资源
    最近更新 更多