堆与栈的区别,递归没有退出条件会怎样,系统怎么判定栈溢出?
1,管理方式不同:栈编译器自动管理,无需程序员手工控制;而堆空间的申请释放工作由程序员控制,容易产生内存泄漏。
2,空间大小不同:栈是一块连续的内存,栈顶的地址和栈底的地址是系统预先规定好的,当申请空间大于剩余空间,提示溢出;堆是不连续的内存区域,获得空间较灵活也较大。
3,是否产生内存碎片
对于堆来讲,频繁的malloc/free(new/delete)势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低(虽然程序在退出后操作系统会对内存进行回收管理)。对于栈来讲,则不会存在这个问题。
4,增长方式不同
堆的增长方式是向上增长,栈的增长方式是向下增长。
5,分配方式不同
堆都是程序中由malloc()函数动态申请分配并由free()函数释放的;栈的分配和释放是由编译器完成的,栈的动态分配由alloca()函数完成,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行申请和释放的,无需手工实现。
内存泄露和内存溢出的区别?
内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,堆积后果很严重,无论多少内存,迟早会被占光。
内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足要求,于是产生溢出。
堆 & 栈& 内存溢出
最新推荐文章于 2022-12-12 20:54:31 发布