Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何耗尽记忆?_C++_Memory Management_New Operator - Fatal编程技术网

C++ 如何耗尽记忆?

C++ 如何耗尽记忆?,c++,memory-management,new-operator,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++)

这可能看起来很傻,但我现在对此有点困惑。为什么这个程序不会消耗所有内存? 例如:我在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;
  }
#包括
#包括
使用名称空间std;
int main()
{

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


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

您的计算似乎有问题

220=1048576
211=2048

若要分配10亿个整数,请尝试230。请注意,
向量
将占用大量空间(至少与正在分配的整数相同)。若要耗尽内存,您根本不需要。您可以调用
new int(i)
并丢弃返回的指针,内存仍将被分配


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

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

2^20大约是100万。因此,虽然您的程序占用了您的一些内存,但它并没有耗尽所有内存。只要将pow()调用增加到一个可笑的大数字,它就会工作。祝您玩得开心


另外:不能保证sizeof(int)==sizeof(int*),尽管这对许多系统都是正确的。

对内存使用存在一些误解

  • 2GB内存机器并不意味着只能使用2GB内存。 (1) 我们有交换空间;(2)Linux过度使用

  • newint
    不占用4字节。 存在内存开销

  • 你不能使用所有的内存。 内存碎片、、文本段等都会占用内存空间


  • 您的程序无法使用其内存执行任何有用的操作。因此,优化器可以将其优化为:

      #include <iostream>
    
      int main()
      {
         std::cout<<sizeof(int*)<<endl;
         for(int i=0; i<(1<<10);i++)
           {
             // nothing
           }
        return 1;
      }
    
    #包括
    int main()
    {
    
    std::cout64位机器现在比较常见。那么理论上会消耗多少内存。大多数linux发行版现在不是默认启用PAE吗?今天的x86-64实现(CPU)只允许指针使用48位(即使它们的大小为64位;其他24位目前被浪费)。这就是2^48或256 TB。这足够一段时间了。@Martin Beckett:PAE只影响操作系统可以访问的内容;32位应用程序仍然限于32位虚拟地址空间。操作系统可以访问36位,这允许32位操作系统使用64GB的实际RAM。您真正想做的是什么?如果您想测试代码是否在内存中工作内存不足的情况下,那么你真的应该编译新版本的new/delete,在测试过程中的适当时间抛出异常。当然,2^30等会起作用。我想知道基于机器RAM大小的确切数字,有可能吗?你已经更改了问题,这使得我的答案不太有用。但是,你仍然我认为2 GB=2 ^ 11,这显然是错误的几个数量级.Re.Point(1):一个进程只能使用2GB。当你考虑(a)多个进程或(b)一台小于(2GB+OS开销)RAM的机器时,交换空间才是相关的。@ Ruh,x86,Linux有3:1(3GB的VM空间为用户模式,1GB为内核空间)多年来。当然,64位机器上可以有更多。单处理器并不意味着你可以使用所有内存(+os开销),一些内存可以被其他进程
    mlock
    。我错误地理解了这个问题,认为机器有2:2的分割。Doh!