c++ 变量的生命周期和内存的分配释放

最近看了很多文章 看的我都蒙了 为什么说变量的生命周期结束的时候 变量所占的内存不一定会被回收呢 难道不是生命周期结束的时候就是所占内存被回收的时候吗????????????????????????????????疯了!!!!!!!!!!!!!! 如果不是生命周期结束的时候 内存就被回收 那生命周期这个概念还有啥用????????

一般情况下,C语言的存储数据内存分好几种:
全局区
常量区
堆区
栈区

全局变量,是全局可见,程序结束后由操作系统收回。
常量区,全局存在,程序结束后由操作系统收回。
堆区,全局存在,程序员主动申请,主动释放,如果不释放,导致内存不足,于一个常驻进程内存泄漏,导致程序异常,无法继续申请内存,当程序结束后,此部分内存由操作系统收回。
栈区,局部存在,系统分配,作用周期在两个花括号之间,进入花括号,操作系统会在栈中开辟一些空间,esp指针减少,称为入栈,当退出花括号,系统会释放分配的栈之内存,esp指针增加,恢复到入花括号之前的状态,称之为出栈。

举例:

#include <stdio.h>
int gv;
int main()
{
const char * cvchar="hello";
static int mvar = 15;
int a,b;
{
int x = 2;
char * p = (char *)malloc(15);
printf("%s");
free(p);
}
}

分析:
gv,mvar:全局区,但是,gv的作用域为程序可见,mvar是main函数内可见;
a,b:栈区,main函数可见,出了main函数,生命周期和作用域结束,所占内存在main结束后被收回。
x,p:栈区,main函数里的花括号可见。出了花括号,x,p的作用域和生命周期均已结束,所占内存被回收。
p指向的内存:堆区,通过malloc分配了15个字节的内存,在free之前或者程序结束前一直可用。

p本身占用了4个指节的内存,在出花括号后这4个字节被回收,但是通过malloc分配的内存并没有被回收,回收仅仅是p而已。

建议多看看,操作系统与编译器相关知识。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-16
如果是你自己用new动态申请内存空间,比如动态定义了一个数组,如果使用完之后需要用delete去释放(回收)内存空间。如果不用delete回收那些申请的空间是不会被自动回收的。不及时回收,会发生内存溢出。追问

这个我到是知道 那局部变量呢 它的生命期结束内存不就释放了吗

追答

局部变量也不一定。如果局部变量被定义为Static,那么该变量是在静态存储区分配的内存,会一直持续到程序结束。一般的局部变量(自动存储的)是在堆栈区里,生命周期结束了就会被自动销毁。

第2个回答  2011-10-16
你给变量申请一个存储空间后你不释放的话 当声明周期结束了 内存就还没有被回收啊追问

我问的到不是这个意思 就是假如一个局部变量 不是出了局部作用域之后 生命周期就结束 生命周期结束 不就是所占用的内存被回收了吗

追答

那是不一定的

追问

为什么是不一定呢 那生命期这个概念还有啥用???

追答

你定义一个局部的动态数组 当你用完之后不释放空间的话 那么这个空间就没有被释放

追问

不不 不是动态的 假如就是这样
void fun()
{
{
int a = 10;
}//@@@
}
a这个变量 不是出了@@@这里 生命期就终结 内存就被回收了吗

追答

这里是的一出@@@就结束

追问

是一出@@@就结束 同时a所占用的内存也被回收了吧

追答

是最后一个}结束 a的内存就被回收

相似回答