C/C++程序中堆区最大有多大?

为什么我在VS2012中new了如此大的空间却不会报错?char* p=new char[1024*1024*1024*1024*1024];

我猜,因为new的参数是size_t类型的,1024*1024*1024*1024*1024 = 0x4000000000000,传参数进去的时候就变成0了,参数是0时一般编译器会为你分配16个字节。

堆间是向上增长的,一般来说看你内存。

试着回答,好象在编译时并不真正的分配空间,只有当软件运行时才会分配,所以编译时不会报错。只有当软件运行时,系统资源不足造成系统崩溃!

编译器会有优化,如果你实际没有使用这么大。同时取决于你的操作系统,32位最大进程空间4g,堆上大概能有1g 到1.5g

不是编译器的优化,而是操作系统的懒惰分配。
另外,1024*1024*1024*1024*1024这个数字上溢了。
这么写
char* p=new char[2*1024*1024*1024];
p[2*1024*1024*1024 - 1]=1;
这么写。

堆得大小跟你的内存有关系的。

不是编译器的优化,而是操作系统的懒惰分配。
另外,1024*1024*1024*1024*1024这个数字上溢了。
这么写
char* p=new char[2*1024*1024*1024];
p[2*1024*1024*1024 - 1]=1;
这么写。