在对象销毁期间调用的函数

4 c++ destructor

您能否提供反映以下规则的代码示例:

N3797 c ++ 14,第3.6.3/2节:

如果函数包含已销毁的静态或线程存储持续时间的块范围对象,并且在销毁具有静态或线程存储持续时间的对象期间调用该函数,则如果控制流通过该程序,则该程序具有未定义的行为.先前销毁的块范围对象的定义.

Rei*_*ica 10

这个给你:

void theFunction()
{
  static std::unique_ptr<int> foo { new int(42) };
}

struct Creator
{
  Creator() { theFunction(); }
};


struct Destroyer
{
  ~Destroyer() { theFunction(); }
};

Destroyer d;
Creator c;

int main()
{}
Run Code Online (Sandbox Code Playgroud)

d首先创建,但它的构造函数什么都不做.然后,c创建并作为其初始化的一部分进行theFunction()调用,这将导致块范围的static-storage-duration变量foo被初始化.

然后,在程序退出时,静态存储对象以相反的构造顺序销毁.所以foo被摧毁了,然后c.最后,d被破坏,但是它的析构函数调用theFunction(),这导致控制流程foo在已经被销毁之后再次达到定义.

您显示的标准引用归因于此未定义的行为.