全局静态存储区、堆区和栈区深入剖析

2016-02-19 11:51 8 1 收藏

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享全局静态存储区、堆区和栈区深入剖析教程,希望对大家能有一点小小的帮助。

【 tulaoshi.com - 编程语言 】

在C++中,内存可分为系统数据区,自由存储区,文本区,const数据区,全局静态区,堆区和栈区。其中,系统数据区存放的是系统数据,我们是不能自由访问的,有时候windows系统会突然弹出一个消息框,内容是“内存不能为read”就是错误访问系统数据区的结果;自由存储区用来存放由C延伸而来的malloc()函数所分配的数据;文本区存放着我们的函数代码,我们调用函数时的底层行为就类似于先去操作一个指针,而这个指针就指向函数指令所在的地址,也就是在文本区中;const数据区,顾名思义,就是存放不可修改的数据的内存区域,我们定义的const变量都存放在这里。最后,我们来看全局静态存储区、堆区和栈区。

先来看全局静态存储区,在程序中,由static标号定义的数据都存放在全局静态存储区中,不论是在main()函数之外的定义的全局变量,还是在子函数中定义的局部变量,只要在定义之前有static标号,定义之后就会始终存在于全局静态存储区中。当然,在main()函数之外定义的全局静态变量在任何地方都可以访问,而在子函数中定义的局部静态变量只有在定义该变量的模块中可见。但是也存在这样一种现象:如前边所述,即使在子函数中定义的局部静态变量,其存在形式也是静态的,也就是说,只要在变量定义的语句执行之后,即使在变量不可见的地方,只要对该变量所在的地址取地址解析操作,也是可以获得该变量的值的。比如我们在函数fun()中定义了一个static int a=100;假设该变量的地址是0x0042AD54,我们在main()函数中调用fun()之后,如果对0x0042AD54取地址解析,也是可以得到100的:int* p=(int*)0x0042ad54; int b=*p;这里b被赋值100。由此,我们可以看到,凡是有static定义的变量的生命周期就是整个程序的生命周期,直到程序退出,静态变量所占据的内存才会被释放。

堆存储区的行为类似于静态存储区,当我们在堆上分配内存之后,如果不进行手动的释放,其内存是不会自动释放掉的。但是在JAVA中,有一种叫做垃圾清理的机制可以自动清理堆内存,但是在C++中没有这样的机制。也就是说,在C++中,如果我们分配了堆内存,就必须手动释放它。否则如果我们不停的分配堆内存,但是不对其进行释放,当对内存被耗尽是就会造成程序崩溃。

一般地,用new分配的变量是存放于堆内存中的,但是返回的指针变量是存放在栈中的。当我们在一个子函数中new了一个变量,但是在函数返回时既没有保存new返回的指针,也没有delete时,就会造成内存泄露。如果我们写的是服务器程序,不断地内存泄露所造成的最终结果就是服务器死机。但是在windows、linux以及其他一些成熟的系统中,都有类似于内存保护的机制。系统会给用户程序分配一定的运行所需的内存,同是也会给系统自身的运行保留一部分内存,这部分内存是用户程序所不能访问的。如果我们编写的程序存在内存泄露,当耗尽系统给应用程序分配的内存之后,程序就会停止运行,而不会造成系统的司机。

至于栈内存,也是我们在写程序中用到的最多的情况。程序中定义的每一个临时对象,new所返回的指针,以及递归函数中变量都是存放在栈中的。栈内存是可以自动释放的,当我们在某个模块中定义了一个对象,在该模块结束时,变量所占据的内存就会被系统回收,在定义新的变量时,新的变量就有可能存放在原变量所在的地址上,但是在系统回收栈内存的时候,是不会清空所释放的栈内存中的数据的,只是将栈顶重新调整,并在新数据的到来时将其分配到栈顶。

在C++中,虽然可以自由操作内存,但这种技术就像是一把双刃剑,用好了锋利无比,用不好反而会造成一些自己都不能理解的莫名其妙的结果。深入理解内存的分配方式,对于实际编程是大有助益的。

来源:https://www.tulaoshi.com/n/20160219/1598886.html

延伸阅读
标签: 洗脸
手把手教你如何洗脸 T区U区方法不同 我们买昂贵的化妆品,天天敷面膜,不就是为了让自己的脸老的不是那么快嘛。可是如果基础没有打好的话,那么再昂贵的化妆品也是毫无益处。洗脸就是护肤最基础的步骤,尤其是T部爱出油,和脸颊部位应该分开处理。T部应该重点去除角质。本文中图老师小编就和大家聊聊去角质的事,好皮肤轻松洗出来!...
标签: T区 草莓鼻 洗脸
不要用强碱的洗面奶或洁面皂,氨基酸和低泡型洁面是不错的选择,洗脸时,T区额头部分从下往上打圈,T区鼻翼两侧手法也是从鼻翼最底部往鼻尖方向揉搓打圈,两颊手法是大面积从下往上打圈。 T区U区怎么清洁?鼻头部分优先去角质 T区U区怎么清洁? 洗脸可没那么简单,如果你还在全脸去角质,那就大错特错了,T区U区该分开护...
标签: 养生 健康
什么是反射区?狭义的反射区是指:中医中的【脚底】、【手部】、【耳部】等反射区。 广义的反射区是指:所有可以产生反射效应的区域其实足、手、耳反射区的产生,是因为足、手、耳是血液流通的末尾部分,而如果出现某个重要器官出了病变,血液便会主要集中的流向那些器官进行免疫斗争,于是通常就比较难流通到足、手、耳,然而这种免疫斗争也有一...
自由的空间安排 谁说看书就一定要在书房,谁说书桌就一定要靠墙。大部分人在进行家居装修是,会将书桌安置在书房,靠墙而设置。其实这样的设计虽然常规,但却无趣。谁都不想无聊的盯着墙看。因此,在设计家里的学习、办公区域我们完全可以自由安排,选择自由开放式的空间来布置家庭办公区域。 卧室工作区 很多人不习惯在书房...
标签: 火腿
红酒雪梨#宜家让家更有味#的做法步骤 1. 准备好所有食材。梨去皮 2. 红酒倒进锅里,烧开,加冰糖,蜂蜜 3. 放入梨子,煮开后,小火慢慢炖,40分钟左右。边炖边用勺子把红酒舀起...

经验教程

597

收藏

65
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部