C++中不同的数据区



c++中内存分配的问题。

c++编译器将计算机内存分为 代码区和数据区,很区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量。 数据区又分为静态数据区、动态数据区以及常量区,动态数据区包括堆区和栈区。
一下是各个区的作用:
(1)代码区:存放程序代码;
(2)数据区
   a.静态数据区: 在编译器进行 编译的时候就为该变量分配的内存,即全局变量和静态变量(用static声明的变量),存放在这个区的数据程序全部执行结束后系统自动释放,声明周期贯穿于整个程序执行过程。
   b.堆区:这部分存储空间完全由程序员自己负责管理,它的分配和释放都由程序员自己负责。这个区是唯一一个可以由程序员自己决定变量生存 期的区间。可以用malloc,new申请对内存,并通过free和delete释放空间。如果程序员自己在堆区申请了空间,又忘记将这片内存释放掉,就 会造成内存泄露的问题,导致后面一直无法访问这片存储区域。但程序退出后,系统自动回收资源。
   c.栈区:存放函数的形式参数和局部变量,由编译器分配和自动释放,函数执行完后,局部变量和形参占用的空间会自动被释放。效率比较高,但是分配的容量很有限。
   d. 常量区: 存放常量的区间,如字符串常量等,注意在常量区存放的数据一旦经初始化后就不能被修改。
  
在弄懂内存分配的问题过后,来看看函数调用的过程:
执行某个函数时,如果有参数,则在栈上为形式参数分配空间(如果是引用类型的参数则除外),继续进入到函数体内部,如果遇到变量,则按情况为变 量在不同的存储区域分配空间(如果是static类型的变量,则是在进行编译的过程中已经就分配了空间),函数内的语句执行完后,如果函数没有返回值,则 直接返回调用该函数的地方(即执行远点),如果存在返回值,则先将返回值进行拷贝传回,再返回执行远点,函数全部执行完毕后,进行退栈操作,将刚才函数内 部在栈上申请的内存空间释放掉。
 
下面通过几个例子来谈谈内存分配和函数返回值的问题:
内存分配的问题:
int a=1;           a在栈区
char s[]="123";    s在栈区,“123”在栈区,其值可以被修改
char *s="123";     s在栈区,“123”在常量区,其值不能被修改
int *p=new int;    p在栈区,申请的空间在堆区(p指向的区域)
int *p=(int *)malloc(sizeof(int)); p在栈区,p指向的空间在堆区
static int b=0;    b在静态区
 

注意:1)全局变量以及静态变量存放在静态数据区;

    2)注意常量的存放区域,通常情况下,常量存放在程序区(程序区是只读的,因此任何修改常量的行为都是非法的),而不是数据区。有的系统,也将部分常量分配到静态数据区,比如字符串常量(有的系统也将其分配在程序区)。但是要记住一点,常量所在的内存空间都是受系统保护的,不能修改。对常量空间的修改将造成访问内存出错,一般系统都会提示。常量的生命周期一直到程序执行结束为止。


转载地址:http://blog.csdn.net/firefly_2002/article/details/8045096

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值