gor*_*ill 2 c++ memory heap memory-management
我需要分配一个相当大的块(或块)内存 - 几千兆字节.但是,如果我尝试分配超过532000000个元素(~2 Gb)的float数组,我会收到运行时错误:
抛出'std :: bad_alloc'的实例后调用terminate():std :: bad_alloc
还行吧:
float* d = new float[532000000];
Run Code Online (Sandbox Code Playgroud)
但这很糟糕(bad_alloc异常):
float* d = new float[533000000];
Run Code Online (Sandbox Code Playgroud)
然后我尝试除了第一个之外还分配另一个数组.发现第二个浮点数组的最大大小是195000000个元素(~748 Mb).
还行吧:
float* d = new float[532000000];
float* e = new float[196000000];
Run Code Online (Sandbox Code Playgroud)
这是不好的:
float* d = new float[532000000];
float* e = new float[197000000];
Run Code Online (Sandbox Code Playgroud)
我想知道应用程序中已分配内存的限制是什么以及如何避免它们?如何使用虚拟内存?
我的系统 - 32位ubuntu 12.10,编译器 - gcc 4.7,RAM - 8GB(〜6.5 Gb免费)
你达到了虚拟地址空间的极限; 即使你有足够的物理RAM(操作系统可能可以通过PAE访问,使用36位指针),在32位系统上每个进程仍然有32位虚拟地址空间,这意味着每个进程都无法映射在内存中超过4 GB的内存.
由于通常虚拟地址空间的上半部分(或者上部1 GB,它取决于内核设置)是为内核保留的,因此通常将分配限制设置为~2 GB,虚拟地址空间碎片可以降低此值数.
有各种解决方法(例如,在Windows上,您可以使用大于4 GB的内存映射文件,一次只映射其中的一部分;可能在Linux上也可以这样做),但目前最简单的解决方案就是转到64位操作系统并重新编译64位应用程序.