一个程序能申请到的内存的多少取决于什么?该如何处理

一个程序能申请到的内存的多少取决于什么?
刚才我弄一个我修改过的书上演示内存耗尽错误的例子。然后发现不同的编译模式对内存的影响居然是不一样的,我用的是VS2012免费版,在64位Win7上测试的。相同的代码,Release的好像只影响了800多M的物理内存,而Debug版的好像是影响了2G的物理内存。但是我加了几个计数,结果显示这两个编译模式循环的次数基本上是一样的,也就是说申请到的内存应该是一样的。
我刚才搜了一下,应用程序能申请到的最大内存好像就是2GB。修改的话需要编辑操作系统的配置文件,再修改应用程序本身,好像可以申请到3G。但是我说的那个情况是怎么回事?为什么物理内存不一样?还有在Linux中是什么情况?
------解决方案--------------------
大概可能是这样的:
WINDOWS的内存管理有这样一种机制:申请的内存如果没有被使用,则只占用虚拟地址空间,已经申请的内存地址空间不能再被分配给其他申请请求,但这只是内存管理记录下内存分配的情况,如果这片内存未被写入内容的话,实际上不会占用物理内存,当有内容写入到申请的内存空间时,这个时候才分配实际的物理内存。
在DEBUG版本下,new申请内存的实现会再加上一条memset()函数调用,这样所有申请的内存都会被初始化为一个固定值,我的VC6版本是初始化为CD,这样在DEBUG版本下,所有申请的内存在被申请之初,就会被写入初始化值,这样就在申请的时候被分配实际的物理内存。
而RELEASE版本申请内存则不会对申请的空间进行被化,则不会占用实际的物理内存空间,直到申请的内存被自己的代码写入值为止。
所以就出现了DEBUG版本占用内存比RELEASE要多的情况。