内存分配中堆和栈的区各是指什么
展开全部
简单地说,栈是属于进程管理的,大小相对固定,规模较小,一旦操作系统为程序分配了栈后就不管了,操作系统将其看做进程的一部分,栈的性质是先进后出,后进先出;堆属于系统维护的,进程可以申请的额外内存空间,访问方式是自由的(相对于栈的先进后出)。
稍微深入点说,栈是由系统在加载程序时给进程分配的一块区域,提供存放栈数据,一般定义的变量都会存在栈区,函数调用以及数据传递和返回、递归、嵌套循环,文件夹等树状层次结构的遍历、表达式的解析都会用到栈区。栈的大小由编译器决定,也可以在IDE(集成开发环境,比如VC, VS,VB或任何编程工具)中设定,编译好的程序包含了栈空间大小的参数,当被操作系统加载时由操作系统一起分配给程序。当程序结束时栈区与进程空间一起被回收释放。
所以,如果定义的数据超过栈的空间程序就会发生溢出而崩溃,编译器不负责检查,因此大容量数据不要分配在栈上。在C++中,应该使用new关键词,用new分配的对象或内存都是在堆上,堆是系统维护的内存空间,也可理解为操作系统中看到的未使用的空间,当执行new的时候就是程序向操作系统申请额外空间,因此new也叫动态分配内存。系统会根据需求大小从未使用的空间中划一块给程序使用,并对该空间进行注册管理,以便当程序结束时释放该空间(假如程序没有主动申请释放)。所以用new创建的空间在使用完了后要及时申请释放(delete 关键词),如果不释放,在程序运行期间如果不断的new大内存,最终也会将整个可用内存用完,导致系统崩溃,当然,如今的操作系统比以前强壮得多,当发生内存用完导致崩溃时,操作系统会干预,直接down掉程序禁止运行下去并回收所有所占空间。
稍微深入点说,栈是由系统在加载程序时给进程分配的一块区域,提供存放栈数据,一般定义的变量都会存在栈区,函数调用以及数据传递和返回、递归、嵌套循环,文件夹等树状层次结构的遍历、表达式的解析都会用到栈区。栈的大小由编译器决定,也可以在IDE(集成开发环境,比如VC, VS,VB或任何编程工具)中设定,编译好的程序包含了栈空间大小的参数,当被操作系统加载时由操作系统一起分配给程序。当程序结束时栈区与进程空间一起被回收释放。
所以,如果定义的数据超过栈的空间程序就会发生溢出而崩溃,编译器不负责检查,因此大容量数据不要分配在栈上。在C++中,应该使用new关键词,用new分配的对象或内存都是在堆上,堆是系统维护的内存空间,也可理解为操作系统中看到的未使用的空间,当执行new的时候就是程序向操作系统申请额外空间,因此new也叫动态分配内存。系统会根据需求大小从未使用的空间中划一块给程序使用,并对该空间进行注册管理,以便当程序结束时释放该空间(假如程序没有主动申请释放)。所以用new创建的空间在使用完了后要及时申请释放(delete 关键词),如果不释放,在程序运行期间如果不断的new大内存,最终也会将整个可用内存用完,导致系统崩溃,当然,如今的操作系统比以前强壮得多,当发生内存用完导致崩溃时,操作系统会干预,直接down掉程序禁止运行下去并回收所有所占空间。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询