8.8程序加载时会生成栈和堆

      EXE 文件的内容分为再配置信息、变量组和函数组,这一点想必大家都清楚了吧。不过,当程序加载到内存后,除此之外还会额外生成两个组,那就是栈和堆。是用来存储函数内部临时使用的变量(局部变量“),以及函数调用时所用的参数的内存区域。是用来存储程序运行时的任意数据及对象的内存领域(图 8-10)。

      EXE 文件中并不存在栈及堆的组。栈和堆需要的内存空间是在EXE 文件加载到内存后开始运行时得到分配的。因而,内存中的程序,就是由用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间这4部分构成的。当然,在内存中,加载Windows 等操作系统的内存空间又是另外一回事了(图 8-10)。

8.8程序加载时会生成栈和堆

 

       栈及堆的相似之处在于,他们的内存空间都是在程序运行时得到申请分配的"。不过,在内存的使用方法上,二者存在些许不同。栈中对数据进行存储和舍弃(清理处理)的代码,是由编译器自动生成的,因此不需要程序员的参与。使用栈的数据的内存空间,每当函数被调用时都会得到申请分配,并在函数处理完毕后自动释放。与此相对,堆的内存空间,则要根据程序员编写的程序,来明确进行申请分配或释放。

      根据编程语言的不同,对堆用的内存空间进行申请分配和释放的程序的编写方法也是多种多样的。C语言中是通过 malloc()函数来进行申请分配、通过 free() 函数来释放的。而 C++中则是通过 new 运算符来申请分配、通过 delete 运算符来释放的。无论是C语言还是C++,如果没有在程序中明确释放堆的内存空间,那么即使在处理完毕后,该内存空间仍会一直残留。这个现象称为内存泄露(memory leak ),它是令C语言及 C++的程序员们十分头疼的一个 bug(程序的错误 )。如果内存泄露一直存在的话,就有可能会造成内存不足而导致宕机。这就好比,如果水龙头一直嘀嗒嘀嗒地漏水,那么一晚上的时间水桶就可能会装满并溢出。

原文链接: https://www.cnblogs.com/24koi/p/17117365.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    8.8程序加载时会生成栈和堆

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/317780

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 下午2:50
下一篇 2023年2月16日 下午2:51

相关推荐