全局、静态、局部静态对象的生命周期
void foo() {
auto d = new D();
E e1;
{E e2;}
E e3;
static F f;
delete d;
}
A a;
namespace bar {
B b;
}
int main() {
G g;
foo();
}
static C c;
执行结果
构造顺序: a b c g d e1 e2 e3 f
析构顺序: e2 d e3 e1 g f c b a
解析
- 在所有函数之外定义的 a、b、c,都是在 main() 开始执行之前,按照出现的顺序依次构造 a、b、c(无论是否在命名空间中,无论是否有 static 修饰)
- main() 函数开始执行,在栈中构造自动(局部非 static)对象 g
- 程序调用 foo(),按顺序先在堆中构造 d,然后在栈中构造自动变量 e1
- 继续执行,在栈中构造自动变量 e2,e2 作用域结束,析构 e2
- 在栈中构造自动变量 e3
- 局部静态对象 f,在程序控制路径经过时才构造(创建),但是和全局对象 a、b、c 一样,会提前在 .data/.bss 段预留空间
- 继续按照代码控制路径,析构 ~d
- foo() 函数结束,析构自动对象 e3,e1,析构顺序与构造顺序相反
- main() 函数结束,析构自动对象 ~g
- 对于局部静态/全局对象 a、b、c、f,其生命周期直到程序结束,在 main() 函数结束之后才开始析构,其析构顺序与构造顺序相反 ~f ~c ~b ~a
验证
https://godbolt.org/z/976W7jaeM (进阶!涉及到函数形参)
本文作者:Zijian/TENG(微信公众号:好记性如烂笔头),转载请注明原文链接:https://www.cnblogs.com/tengzijian/p/17205151.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-03-11 VSCode 自动添加版权信息
2021-03-11 QtCreator 自动在文件开头添加版权注释信息