中的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/

10-11 14:38