您的位置:首页 > 编程语言 > C语言/C++

<C++略识>之内存分配

2016-07-14 16:58 405 查看
C++编译器主要将计算机内存分为以下几个存储区域:

1、代码区:主要存放程序代码,即存储程序逻辑代码的二进制

2、数据区(静态存储区和动态存储区)

—–>静态存储区:在编译器进行编译的时候就为该变量分配的内存,存放在这个区的数据在程序全部执行结束后系统自动释放,生命周期贯穿于整个程序执行过程。主要存放的是全局变量和静态变量,另外还有一个比较特别的是有的系统也将字符串常量也存放在静态存储区。

—–>动态存储区又分为栈区和堆区

(1)栈区:存放函数的形式参数和局部变量,由编译器分配和自动释放,函数执行完后,局部变量和形参占用的空间会自动被释放。效率比较高,但是分配的容量很有限。主要存放的是形参和局部变量

(2)堆区:这部分存储空间完全由程序员自己负责管理,它的分配和释放都由程序员自己负责。这个区是唯一一个可以由程序员自己决定变量生存期的区间。可以用malloc和new申请对内存,并通过free和delete释放空间。如果程序员自己在堆区申请了空间,又忘记将这片内存释放掉,就会造成内存泄露的问题,导致后面一直无法访问这片存储区域。

3、常量存储区

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

在弄懂内存分配的问题过后,来看看函数调用的过程:

执行某个函数时,如果有参数,则在栈上为形式参数分配空间(如果是引用类型的参数则类外),继续进入到函数体内部,如果遇到变量,则按情况为变量在不同的存储区域分配空间(如果是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在静态区
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: