三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

全局/静态区的变量在程序中的生命周期是如何确定的?

全局/静态区的变量在程序中的生命周期是如何确定的?

一、生命周期的完整流程(4 步)

1. 程序加载时(main 执行前)

  • 操作系统把程序载入内存
  • 全局区 / 静态区内存就已经分配好了
  • 变量完成初始化
    • 显式初始化(int a=10
    • 未初始化 → 自动设为0 / nullptr / false

2. main 函数开始运行

  • 这些变量早已存在,随时可用

3. 函数调用 / 程序运行中

  • 无论函数调用多少次
  • 无论变量是否在函数内部
  • 它们始终存在,不会被销毁,不会重置

4. 程序结束(main 退出后)

  • 系统自动回收全局/静态区内存
  • 不需要手动 delete
  • 不需要手动释放

二、3 种变量生命周期对比(最关键)

1. 局部变量(栈)

生命周期:函数开始 → 函数结束
函数结束就死,下次调用重新创建。

2. 堆变量(new/malloc)

生命周期:new 创建 → delete 销毁
你不删,它就一直占内存。

3. 全局 / 静态变量(全局区)

生命周期:程序启动 → 程序退出
全程在线,永不重启


三、最经典例子:静态变量为什么只初始化一次?

voidfunc(){staticintcount=0;// 静态变量,全局区count++;cout<<count<<endl;}intmain(){func();// 1func();// 2func();// 3}

为什么输出 1、2、3?

因为:

  • static 变量在程序启动时就初始化好了
  • 不是进入函数才初始化
  • 函数调用只是访问它,不是创建它
  • 永远不会被重置为 0

这就是生命周期带来的效果。


四、作用域 vs 生命周期(99%的人混淆)

作用域(能在哪用)

  • 全局变量:整个程序
  • 函数内 static:只在函数内可用

生命周期(能活多久)

不管作用域在哪,全局/静态变量都活整个程序!

总结一句超级重要的话:

作用域决定你能不能访问它;
生命周期决定它活不活着。

静态变量:作用域小,但生命周期长


五、全局/静态变量生命周期的 4 个铁律(面试必背)

  1. 在 main 函数执行之前就已经创建并初始化
  2. 程序运行期间永远存在,不会被销毁
  3. 无论函数调用多少次,都不会重新创建
  4. 程序结束时由系统自动回收,无需手动释放

六、最简单记忆口诀

全局静态不一般,
程序启动就创建,
不关函数生与死,
程序结束才归还。


最终总结(极简版)

  • 全局变量:程序开始 → 程序结束
  • static 变量:程序开始 → 程序结束
  • 它们都在全局/静态区
  • 生命周期完全由程序决定,不由函数决定

← 返回列表