【问题标题】:Do I have more than 265GB memory on my 8GB RAM laptop?我的 8GB RAM 笔记本电脑是否有超过 265GB 的内存?
【发布时间】:2015-03-21 16:06:43
【问题描述】:

我编写了一个程序,它分配内存并计算最低地址和最高指针之间的大小。 我对结果感到惊讶。当我启动它时,它需要 20mb 的内存,40、60 ... 200、220、240、... 3000mb、3020mb,然后突然爆炸,262000mb,等等。 谁能解释一下为什么?

#include <iostream>
using namespace std;
int aaa;
int *max1=&aaa;
int *min1=&aaa;

void results(){
    cout<<"min "<<min1<<endl;
        cout<<"max "<<max1<<endl;
        double mln= 1e6;
        cout<<"min-max= "<<(max1-min1)/(1024*1024)<<"mb"<<endl;
}

void logic(int *c){
    if(c>max1){
        max1=c;
    }
    if(c<min1){
        min1=c;
    }
    static int i;
    i++;
    if(i%800==0)
    results();
}


int main(){
    int *x;
    int l=0;
    while(l<=500000000){
        l++;
        x=new int[20000];
        logic(&x[19999]);
    }

}

【问题讨论】:

  • 您的程序存在内存泄漏。你从来没有在你用于new[]的内存上调用delete[]
  • @PaulMcKenzie:这显然是我们想要的。
  • 并且显示的消息“min-max=”应该更正为“max-min=”。
  • 如果您可以包含硬盘/固态磁盘驱动器的容量,这将有很大帮助。

标签: c++ operating-system


【解决方案1】:

比较(并因此减去)不指向同一数组元素的指针是没有意义的(双关语)。

你正在对不相关的地址进行指针运算,结果有什么意义?

您不是在将同一块分配的最低地址与最高地址进行比较,而是将看到的最低地址与在 800 个不同内存分配中看到的最高地址进行比较。

考虑在所有这些调用之间发生的所有堆碎片(可能还有回收)。你可以得到正数、负数或零作为你的差异。

如果您要确定的是堆的范围,那么这是一种过于随机的方法,因为您无法保证在内存不足和崩溃之前找到最小和最大的地址。

还要考虑虚拟内存和分页的影响。通过虚拟内存的现代实现,理论上您可以访问尽可能多的内存(我认为),无论您实际安装了多少 RAM。

另外,请参阅: Allocating more memory than there exists using malloc 以及来自 cmets 的关于虚拟内存的链接。

【讨论】:

    【解决方案2】:

    您的程序正在使用 malloc() 分配内存。这会从进程堆中获取内存。堆由一个或多个连续的预保留内存范围组成。每当您从堆中分配时,系统将使用和操作堆数据结构以在堆内为您提供所需大小的空闲范围,并根据需要为该范围分配物理内存页面。当您分配大量内存时,您最终将消耗堆范围内的所有空间。然后系统将保留一个新的范围。但是新范围不一定正好在旧范围之上,因为虚拟地址空间可以被分割,并且还有 ASLR(地址空间布局随机化)导致系统使用随机基地址而不是遵循一致的算法保留堆内存。所以你甚至不能期望你的程序的行为一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2022-01-25
      • 2020-09-27
      • 1970-01-01
      • 2014-07-24
      相关资源
      最近更新 更多