内存分配方式

以前大一的时候学习过内存的分配方式,用到的是谭浩强的书。

现在又看了高质量c、c++编程,又唤起了对曾经学到过的知识的回忆。

温故而知新,现总结如下:

内存的分配方式有三种,在静态存储区域分配的内存空间,在堆栈上的分配的内存空间还有就是在堆或自由存储空间上的分配的内存空间。

1.静态存储区域在程序编译的过程中就已经编译好了,他们存在的生命周期贯穿着整个程序的运行。

静态存储区的存储的数据分别是全局变量,static 变量还有常量

此处注意,常量所占的内存空间,只可被读而不可被写。

典型的:char *str="i am constant";

此处str字符指针指向的是一段常量的内存空间,于是"i am constant"这段常量空间就有下图的特质,当常量空间的str[0]这个位置被写入一个'c'时,发生异常。

 

 

这样定义就没问题:char str[]="i am constant";

因为此时str指向的是在栈区上的一片空间。

栈区将在下面讲到。

2.栈区或称堆栈

在栈区上的变量常为函数内的局部变量,函数结束的那一刻,这些存储单元自动被释放。堆栈(栈区)的内存分配运算内置于处理器的指令集(risc)中,所以在栈区分配内存空间的过程是十分迅捷的,但是值得注意的一点是,栈区的内存容量有限,有可能会导致栈区溢出。

3.堆区或者自由存储空间

在堆区的存储空间一般来说是由malloc或new等关键字来分配的,同时程序员也要掌握好恰当的释放内存的时机。

操作系统的堆管理器主掌动态分配内存的功能。

(1)堆管理器搜索是否有空闲的内存块。

调用多次以后内存终将会出现许多闲散的内存碎片。

如果在这样的情况下,再次请求分配动态空间,那就会出现许多将碎片化空间合并的时间,十分耗时。

(2)动态分配内存空间失败时,将会有个返回异常的时间,那也将会十分耗时。

(3)需要十分小心的分配,以及释放空间。

综上,小心动用动态分配内存,因为耗时+容易导致由粗心产生的问题+即使不粗心也会出现错误。

 

posted @ 2015-04-04 15:41  jidan  阅读(284)  评论(0编辑  收藏  举报