c++ 变量的生命周期和内存的分配释放
最近看了很多文章看的我都蒙了为什么说变量的生命周期结束的时候变量所占的内存不一定会被回收呢难道不是生命周期结束的时候就是所占内存被回收的时候吗??????????????...
最近看了很多文章 看的我都蒙了 为什么说变量的生命周期结束的时候 变量所占的内存不一定会被回收呢 难道不是生命周期结束的时候就是所占内存被回收的时候吗????????????????????????????????疯了!!!!!!!!!!!!!! 如果不是生命周期结束的时候 内存就被回收 那生命周期这个概念还有啥用????????
展开
3个回答
展开全部
一般情况下,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而已。
建议多看看,操作系统与编译器相关知识。
全局区
常量区
堆区
栈区
全局变量,是全局可见,程序结束后由操作系统收回。
常量区,全局存在,程序结束后由操作系统收回。
堆区,全局存在,程序员主动申请,主动释放,如果不释放,导致内存不足,于一个常驻进程内存泄漏,导致程序异常,无法继续申请内存,当程序结束后,此部分内存由操作系统收回。
栈区,局部存在,系统分配,作用周期在两个花括号之间,进入花括号,操作系统会在栈中开辟一些空间,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而已。
建议多看看,操作系统与编译器相关知识。
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
如果是你自己用new动态申请内存空间,比如动态定义了一个数组,如果使用完之后需要用delete去释放(回收)内存空间。如果不用delete回收那些申请的空间是不会被自动回收的。不及时回收,会发生内存溢出。
追问
这个我到是知道 那局部变量呢 它的生命期结束内存不就释放了吗
追答
局部变量也不一定。如果局部变量被定义为Static,那么该变量是在静态存储区分配的内存,会一直持续到程序结束。一般的局部变量(自动存储的)是在堆栈区里,生命周期结束了就会被自动销毁。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你给变量申请一个存储空间后你不释放的话 当声明周期结束了 内存就还没有被回收啊
更多追问追答
追问
我问的到不是这个意思 就是假如一个局部变量 不是出了局部作用域之后 生命周期就结束 生命周期结束 不就是所占用的内存被回收了吗
追答
那是不一定的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询