我有两个简单的C++程序和两个问题.我在CentOS 5.2工作,我的开发环境如下:
g ++(GCC)4.1.2 20080704(Red Hat 4.1.2-50)
"ulimit -s"输出:10240(千字节),即10MB
计划#1:
main.cpp中:
int main(int argc, char * argv[]) { char buf[1024*1024*11] = {0}; return 0; }
(用"g ++ -g main.cpp"编译)
程序在堆栈上分配1024*1024*11字节(即11MB),但不会崩溃.将分配大小更改为1024*1024*12(即12MB)后,程序崩溃.我认为这应该是由堆栈溢出引起的. 但是为什么程序在分配大小为11MB时不会崩溃,这也大于10MB的上限?
计划#2:
main.cpp中:
#includeint main(int argc, char * argv[]) { char buf[1024*1024*11] = {0}; std::cout << "*** separation ***" << std::endl; char buf2[1024*1024] = {0}; return 0; }
(用"g ++ -g main.cpp"编译)
该程序将导致程序崩溃,因为它在堆栈上分配12MB字节.但是,根据核心转储文件(见下文),崩溃发生在buf但不是buf2. 不应该崩溃发生在buf2上,因为我们从程序#1知道char buf [1024*1024*11]的分配是正常的,因此在我们分配另一个1024*1024字节后,堆栈会溢出吗?
我认为必须有一些非常基本的概念,我没有建立一个坚实的理解.但是他们是什么?
附录:程序#2生成的核心转储信息:
Core was generated by `./a.out'. Program terminated with signal 11, Segmentation fault. [New process 16433] #0 0x08048715 in main () at main.cpp:5 5 char buf[1024*1024*11] = {0};
Per Johansso.. 6
您错误地认为堆栈分配发生在代码中.只要有编译时已知大小的局部变量,就会在输入函数时将它们的空间分配在一起.稍后仅分配动态大小的局部变量(VLA和alloca).
此外,只要您写入内存,就会发生错误,而不是在第一次分配时发生.很可能buf位于堆栈上的buf2之前,溢出因此发生在buf中,而不是buf2.
您错误地认为堆栈分配发生在代码中.只要有编译时已知大小的局部变量,就会在输入函数时将它们的空间分配在一起.稍后仅分配动态大小的局部变量(VLA和alloca).
此外,只要您写入内存,就会发生错误,而不是在第一次分配时发生.很可能buf位于堆栈上的buf2之前,溢出因此发生在buf中,而不是buf2.