C/C++编译的程序占用的内存分为以下几个部分:
1.栈区(stack)-----程序运行时由编译器自动分配,程序结束时由编译器自动释放。存放函数的参数、局部变量、返回数据、返回地址等值。
2.堆区(heap)-----在内存中开辟另一块存储区域,一般由程序员分配,若程序员不释放,程序结束时可能由OS回收,与数据结构中的堆不是一回会事,分配方式类似于链表。
3.全局区(static)---编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的 另一块区域(BSS).程序结束后由系统释放。
4.文字常量区----常量字符串存放在这里,程序结束后由系统释放。
5.程序代码区----存放函数体的二进制代码
------
A. 全局变量在程序开始时就分配内存, 而静态局部变量在对应函数第一次执行时分配内存.
-------
jtextarea 固定大小
内存分配方式有三种:
1.从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量,static变量
2.在栈上创建,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高, 但分配的内存容量有限。
3.从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或者new申请任意多少的内存,程序员自己负责在何时用free或者delete释放内存。动态内存的生存周期由程序员决定,使用很灵活,但是如果在堆上分配了空间,那么就有责任回收它,否则运行的程序会出现内存泄露,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。
申请方式:
stack:由系统自动分配,例如,声明在函数中一个局部变量int b,系统自动在栈中为b开辟空间。
heap:需要程序员自己申请,并指明大小在c中是malloc函数,在C++中是new运算符
如p1=(char*)malloc(10); //p2=new char[10];
注意p1和p2本身是在栈中的
申请后系统的响应:
栈:只要栈的剩余空间大于所申请的空间,系统将为系统提供内存,否则将报异常提示栈溢出
堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并将该结点的空间分配给程序。--由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
申请大小限制:
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。栈的大小是在编译时就确定的常数,为2M有的也说是1M。
堆:是向高地址扩展的数据结构,是不连续的内存区域。