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

最近看了很多文章看的我都蒙了为什么说变量的生命周期结束的时候变量所占的内存不一定会被回收呢难道不是生命周期结束的时候就是所占内存被回收的时候吗??????????????... 最近看了很多文章 看的我都蒙了 为什么说变量的生命周期结束的时候 变量所占的内存不一定会被回收呢 难道不是生命周期结束的时候就是所占内存被回收的时候吗????????????????????????????????疯了!!!!!!!!!!!!!! 如果不是生命周期结束的时候 内存就被回收 那生命周期这个概念还有啥用???????? 展开
 我来答
帐号已注销
推荐于2018-03-29 · TA获得超过2326个赞
知道小有建树答主
回答量:419
采纳率:83%
帮助的人:217万
展开全部
一般情况下,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而已。

建议多看看,操作系统与编译器相关知识。
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
qlj198954
2011-10-16 · TA获得超过127个赞
知道小有建树答主
回答量:148
采纳率:0%
帮助的人:132万
展开全部
如果是你自己用new动态申请内存空间,比如动态定义了一个数组,如果使用完之后需要用delete去释放(回收)内存空间。如果不用delete回收那些申请的空间是不会被自动回收的。不及时回收,会发生内存溢出。
追问
这个我到是知道 那局部变量呢 它的生命期结束内存不就释放了吗
追答
局部变量也不一定。如果局部变量被定义为Static,那么该变量是在静态存储区分配的内存,会一直持续到程序结束。一般的局部变量(自动存储的)是在堆栈区里,生命周期结束了就会被自动销毁。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
左自强
2011-10-16 · TA获得超过385个赞
知道小有建树答主
回答量:528
采纳率:0%
帮助的人:350万
展开全部
你给变量申请一个存储空间后你不释放的话 当声明周期结束了 内存就还没有被回收啊
更多追问追答
追问
我问的到不是这个意思 就是假如一个局部变量 不是出了局部作用域之后 生命周期就结束 生命周期结束 不就是所占用的内存被回收了吗
追答
那是不一定的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式