我可以分配所有可用的RAM吗?

时间:2016-05-05 20:10:22

标签: c++ new-operator

我正在尝试分配所有可用的RAM。我期待我的计算机开始运行不佳,但在Visual Studio中使用以下程序没有任何不妥。

int main()
{
   while (true)
   {
        int* i = new int[1000];
   }

    return 0;
}

这个程序甚至都无穷无尽。它很快就结束了。为什么?我期待看到内存使用量增长,然后谁知道是什么。

我甚至试过这个,但仍然没有问题:

int main()
{
   while (true)
   {
        int* i = new int[1000];

        for (int k = 0; k < 1000; ++k)
            i[k] = k;
   }

   return 0;
}

它有点工作并说&#34;按任意键......&#34;。怎么了?

3 个答案:

答案 0 :(得分:1)

最终您将使用所有内存和交换文件 - 但您需要使用64位编译器和64位设置, 否则,当你可以分配2gb(或4?不记得)时,新的最终会失败。

答案 1 :(得分:1)

当然,如果您分配了所有计算机的RAM,那么您的计算机将会失败。如果您正在运行泄漏/膨胀的软件,例如停止运行的计算机并不罕见谷歌浏览器。在Linux系统上,当可用内存耗尽时,您可以触发进程的自发谋杀。

如果你期望像火一样的东西,你将不得不使用一个不能完成其工作的操作系统,以及一个......我不知道的CPU,它有一个非常严重的错误。我猜你也可能想要一个犯罪危险且被市场禁止的PSU。

无论如何,为了达到这一点,你需要:

  • 通过使您的程序使用此内存执行来说服您的编译器实际上导致分配 - 这必须足以使循环不被完全从你的计划;
  • 为页面文件留出的磁盘空间量。

你永远不会让程序“无限地”运行。没有什么能“无限地”运行。

答案 2 :(得分:1)

刚刚在ubuntu 15.10(64)上进行了实验。系统正常运行足够长的时间让我运行“系统监视器”。 (应该先做,哎呀)

系统监视器报告了ram使用几秒钟的增长,直到所有可用的ram填充(~3.9G),然后(大约15秒)系统似乎锁定...鼠标指示器停止跟踪鼠标移动,并且键盘输入似乎被忽略(但可能已在某处排队),甚至系统监视器更新似乎停止。

我猜是明显的'锁定'是因为4 GByte交换开始填充和颠簸。

一两分钟后,我的不耐烦赢了,我强行重启。

我之前看过这种行为,今年早些时候。我认为这是一个Firefox问题,但我无法重现。