如何耗尽记忆力?

时间:2011-07-07 04:10:21

标签: c++ memory-management new-operator

这可能看起来很傻,但我现在对此感到困惑。为什么这个程序不会占用所有内存? 例如:我在Linux(2G RAM)终端中运行以下程序,

  #include <iostream>
  #include <cmath>
  using namespace std;

  int main()
  {
     cout<<sizeof(int*)<<endl;
     for(int i=0; i<pow(2.0,30.0);i++)
       {
         new int(i);
       }
    return 1;
  }

1)我确认这台机器的int大小是4个字节,然后是2GB ram,它只能容纳2 ^ 30/2 ^ 2 = 2 ^ 28

2)按照上面的逻辑,你怎么能改变程序实际消耗所有的2GB内存?

补充:我只是想确保我理解正确。如果没有虚拟内存或操作系统优化等..,2GBRAM只能容纳2 ^ 28 int,是吗?在这种情况下,上述程序将消耗所有内存?你知道如何在linux中关闭虚拟内存/交换内存功能等吗?

谢谢!

5 个答案:

答案 0 :(得分:7)

由于虚拟寻址,您可以分配比实际拥有的RAM更多的内存。操作系统将自动分页您不使用的内存(到硬盘)。这样,RAM就可以作为硬盘交换文件的大缓存,代表系统的实际内存。

您的实际限制是指针的地址空间,除非您为64位平台编译(并运行),否则该指针的地址空间为32位。所以你可以分配4GB的空间。

答案 1 :(得分:4)

你的计算似乎很可疑。

2 20 = 1,048,576
2 11 = 2,048

要分配十亿个整数,请尝试2 30 。请注意,您的vector<int*>将占用大量空间(至少与您分配的整数一样多)。简单地耗尽内存,你根本不需要它。你可以调用new int(i)并丢弃返回的指针,内存仍将被分配。

请记住,您的计算机可能还有超过您安装的2 GB物理RAM的虚拟内存。

答案 2 :(得分:1)

您的程序对其内存没有任何用处。因此,优化器可以将其优化为:

  #include <iostream>

  int main()
  {
     std::cout<<sizeof(int*)<<endl;
     for(int i=0; i<(1<<10);i++)
       {
         // nothing
       }
    return 1;
  }

答案 3 :(得分:0)

2 GB与20亿字节相同。这意味着你的RAM可以容纳大约5亿个int指针。现在,您的系统还有一个用于存储的交换文件,可能与您的RAM或更大一样大。

2 ^ 20大约是一百万。因此,虽然你的程序会占用你的一些内存,但它并没有全部使用它。只需将pow()调用增加到一个非常大的数字,它就会起作用。玩得开心!

另外:不能保证sizeof(int)== sizeof(int *),尽管对于许多系统都是如此。

答案 4 :(得分:0)

对内存使用存在一些误解。

  1. 2GB内存机并不意味着你只能使用2GB内存。 (1)我们有交换空间; (2)Linux overcommits。

  2. new int不占用4个字节。 有内存开销

  3. 您无法使用所有内存。 内存碎片,.text部分等都占用了内存空间。