当前位置:  开发笔记 > 运维 > 正文

为什么我的程序在堆栈上限为10MB时分配11MB字符串数组时不会溢出堆栈?

如何解决《为什么我的程序在堆栈上限为10MB时分配11MB字符串数组时不会溢出堆栈?》经验,为你挑选了1个好方法。

我有两个简单的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中:

#include 

int 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.



1> Per Johansso..:

您错误地认为堆栈分配发生在代码中.只要有编译时已知大小的局部变量,就会在输入函数时将它们的空间分配在一起.稍后仅分配动态大小的局部变量(VLA和alloca).

此外,只要您写入内存,就会发生错误,而不是在第一次分配时发生.很可能buf位于堆栈上的buf2之前,溢出因此发生在buf中,而不是buf2.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有