程序内存空间
代码区..............
(code area)
全局数
据区................
(data area)
堆区................
(heap area)
栈区................
(stack area)
一个程序将操作系统分配给其运行的内存块分为4个区域:
1。代码区:存放程序的代码,即程序中的各个函数代码块。
2。全局数据区:存放程序的全局数据和静态数据。
3。堆区:存放程序的动态数据。
4。栈区:存放程序的局部数据,即各个函数中的数据。
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
栈是一种数据结构,它的工作原理就象在子弹匣中压子弹一样,最先压入的子弹要等到最后才飞射出去,而最后压入的子弹则首先飞射出去
c++的函数调用过程,需要调用初始化和善后处理的环节。函数调用的整个过程就是栈空间操作的过程。函数调用时,首先:
1。建立被调函数的栈空间。
2。保护调用函数的运行状态和返回地址。
3。传递参数。
4。将控制转交被调函数。
函数的栈操作原理是一致的,但具体的实现因编译器的不同而不同。
注意:栈是有限的资源,每次调用一个函数,所建立的的栈空间都比上一个函数的栈空间要小。可以看出,如果一层层调用下去,或者
过多的定义局部变量特别是数组,最后可能导致栈空间枯竭而引起程序运行出错。如果程序确实要占用相当大的栈空间,可以在连接前
通过设置栈空间大小来改善。
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
1。堆内存:
堆(heap)是内存空间。
堆,允许程序在运行时(而不是在编译时)申请某个大小的内存空间。
程序在编译和连接时不予确定这种在运行中获取的内存空间,这种内存
环境随着程序运行的进展而时大时小,这种内存就是堆内存,所以堆内
存是动态的。
堆内存也称 动态内存。
2。获得堆内存:
函数malloc()是c程序获得堆内存的一种方法,它在alloc.h头文件中声明。
malloc()函数的原型为:
void * malloc(size_t size);
size_t 即 unsigned long
该函数从堆内存中“切下”一块 size 大小的内存,将指向该内存的地址返回。
该内存中的内容是未知的。
注意!程序中并不能保证一定可以从堆中获得所需要的内存。有时,系统所能
提供的堆空间不够分配,这时系统会返回一个空指针值NULL。这时,所有对该
指针的访问都是破坏性的,因此,调用malloc()函数应该如下:
if(array = (int *)malloc(arraysize*sizeof(int))==NULL)
{
cout<<"can't allocate more memory, terminating. /n";
exit(1);
}
3。释放堆内存:
函数free()返还由malloc()函数分配的堆内存。
void free(void *);
4。new与delete:
new 和 delete 是 c++ 专有的操作符,它们不用头文件声明。new类似于函数malloc(),
分配堆内存,但是比malloc()更简练。new的操作数为数据类型,它可以带初始化值表或
单元个数。new返回一个具有操作数之数据类型的指针。
delete函数,当返回的是new分配的数组时,应该带[],即 delete[]array