如果这是一台32位计算机,则将拥有3Gb的地址空间供您使用-1Gb是为内核保留的,其中相当一部分地址空间将被共享库,exe文件,数据段等占用您应该查看/ proc / pid / maps以了解地址空间的布局.
很难知道有多少物理地址空间可用,您的所有系统进程,内核和其他进程都会吃掉它.假设这些总和不超过1Gb,您仍然可以使用3Gb.
可能正在发生碎片:
0Gb 3Gb
---------------------~------------------------------------
|Stuff | Heap,1.2Gb allocated stuff | free heap | Stack|
---------------------~------------------------------------
然后,您释放了大对象,但是在其他一些内存之间
分配,剩下的就是这个:
0Gb 3Gb
---------------------~------------------------------------------
|Stuff | Heap,1.2Gb free |small object(s) | free heap | Stack|
---------------------~------------------------------------------
如果您现在尝试分配更大的对象,则它将无法容纳在可用的1.2Gb空间中
而且也可能不适合自由堆空间,因为那可能没有足够的空间.
如果您大量使用堆栈,则可能是堆栈不断增长并占用了空间
否则可以用于堆空间-尽管默认情况下,大多数发行版将堆栈限制为8-10Mb.
使用malloc / realloc将无济于事.但是,如果您知道所需的最大对象的大小,则可以在启动时保留这么多的对象.该片永远都不应被释放/删除,而应该重新使用.但是,这是否会使您在其他地方陷入其他麻烦却很难确定-其他对象的可用空间会变小.