中的https://en.cppreference.com/w/cpp/language/lifetime注释部分具有此代码,在此处复制:
struct A {
int* p;
~A() { std::cout << *p; } // if n outlives a, prints 123
};
void f() {
A a;
int n = 123; // if n does not outlive a, this is optimized out (dead store)
a.p = &n;
}
在 Notes 部分中要说什么?
据我了解,该代码是UB(或者是UB),因为显然
n
不会超过a
。这是什么意思:
但是和没关系。
这整个部分让我感到非常困惑。
最佳答案
这是C++生命周期规则的一个奇怪方面。 [basic.life]/1 tells us对象的生命周期结束:
重点已添加。 int
不是“具有非平凡析构函数的类类型”,因此其生存期仅在释放其占用的存储空间时结束。相比之下,A
是具有非平凡析构函数的类类型”,因此其生命期在调用析构函数时结束。
根据[basic.stc.auto]/1,在退出作用域时释放作用域的存储:
但是自动变量按照[stmt.jump]/2被销毁:
请注意,已指定销毁顺序,但未指定自动存储释放顺序。这意味着该实现可以在销毁每个变量后立即释放存储,或稍后或以任意其他顺序一次释放所有存储。
现在,它使用单数形式进行存储(“用于...的存储”)而不是单独讨论每个变量的事实可能表明,意图是针对该范围立即释放整个存储。但是标准中对此没有明确说明。因此,只要在释放存储之前销毁变量,销毁与释放的任何顺序似乎都是合法的。
这意味着代码完全有可能工作,n
的生存期超过a
。但是尚不清楚它是否起作用。
关于c++ - 生命周期结束规则有何不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53785791/