Tre*_*key 21 c++ static scope lifetime undefined-behavior
在与我的一位同事交谈时,他们说:
Run Code Online (Sandbox Code Playgroud)foo() { int *p; { int x = 5; p = &x; } int y = *p; }创建未定义的行为,因为生命周期规则和范围规则未指定.
然而:
Run Code Online (Sandbox Code Playgroud)foo() { int *p; { static int x = 5; p = &x; } int y = *p; }没有定义!您最终会遇到"间接范围"问题.
术语的使用听起来不正确.
我知道静态与范围无关.
第二种情况是否定义了行为?
Nat*_*ica 31
是的,第二种情况有明确的行为.一个static变量基本上是一个全局变量,其名称可以被限制它在声明的范围.这是首次初始化输入范围,然后该程序的人生活的.
所以当我们到达时
int y = *p;
Run Code Online (Sandbox Code Playgroud)
p 指向一个您无法再访问的变量(无法返回到该代码)但仍具有有效生命周期.
引用标准[basic.stc.static]
所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间.这些实体的存储应持续该计划的持续时间
强调我的
第一种情况是未定义的,因为本地范围的生命周期x结束,}并且在其生命周期结束后尝试引用它是未定义的行为.