我正在玩耍以了解可以分配多少内存。最初我认为可以分配的最大内存等于物理内存(RAM)。我通过运行如下所示的命令在 Ubuntu 12.04 上检查了我的 RAM:
~$ free -b
total used free shared buffers cached
Mem: 3170848768 2526740480 644108288 0 265547776 1360060416
-/+ buffers/cache: 901132288 2269716480
Swap: 2428497920 0 2428497920
如上所示,总物理内存为 3Gig(3170848768 字节),其中只有 644108288 字节是空闲的,所以我假设我最多只能分配这么多内存。我通过编写仅以下两行的小程序对其进行了测试:
char * p1 = new char[644108290] ;
delete p1;
由于代码运行完美,这意味着它成功分配了内存。此外,我尝试分配大于可用物理空闲内存的内存,但它没有引发任何错误。然后每个问题
我认为它必须使用虚拟内存。所以我测试了免费交换内存的代码,它也有效。
char * p1 = new char[2428497920] ;
delete p1;
我试图分配空闲交换加上空闲 RAM 字节的内存
char * p1 = new char[3072606208] ;
delete p1;
但是这次代码抛出bad_alloc
异常失败。为什么这次代码不起作用。
现在我在一个新程序中在编译时分配内存,如下所示:
char p[3072606208] ;
char p2[4072606208] ;
char p3[5072606208];
cout<<"Size of array p = " <<sizeof p <<endl;
cout<<"Size of array p2 = " <<sizeof p2<<endl;
cout<<"Size of array p2 = " <<sizeof p3;
输出显示
Size of array p = 3072606208
Size of array p1 = 4072606208
Size of array p2 = 777638912
你能帮我理解这里发生了什么吗?为什么它允许在编译时分配内存而不是动态分配。p
当分配编译时间时,如何p1
能够分配大于交换内存和可用 RAM 内存的内存。哪里p2
失败了。这究竟是如何工作的。这是一些未定义的行为还是特定于操作系统的行为。谢谢你的帮助。我正在使用 Ubuntu 12.04 和 gcc 4.6.3。