【问题标题】:Static destruction of local-static object局部静态对象的静态销毁
【发布时间】:2012-04-27 15:31:31
【问题描述】:

帮助我理解这一点...见粗体字。从标准 3.6.3 终止(2)

2 如果函数包含静态或线程的块范围对象 已销毁且调用该函数的存储持续时间 在使用静态或线程存储销毁对象期间 持续时间,程序有未定义的行为,如果控制流 通过先前销毁的块作用域的定义 对象。同样,如果块范围对象的行为未定义 在销毁后间接使用(即通过指针)。

Manager& GetManager()
{
    static Manager localMan;
    return localMan;
}

然后在别的地方……

{
   static User localUser;
   localUser.DoSomething(); //localUser calls GetManager and uses the reference returned.
}

然后在 User 析构函数中...

User::~User()
{
   GetManager().DoSomethingOneLastTime();
}

//Now lets say Main exits and static destruction begins.
//Somehow localMan is destructed before User.
//Then user calls the GetManager() function in it's destructor.
//What case is this defined, and what case makes this undefined?

标准是说如果使用 odr-use 规则静态创建的本地静态 localMan 对象被破坏,然后再次调用该函数(是否创建新的静态),这是未定义的吗?看起来它为已定义的行为留出了空间,但如果它通过了被破坏对象的定义,则不是。

有人对此有明确的见解吗?

【问题讨论】:

    标签: c++ static local termination destruction


    【解决方案1】:

    我相信这里的关键词是

    是否创建新静态

    如果这发生在静态对象的销毁过程中,并且会导致重新创建一些已经销毁的静态对象,那么它们什么时候会被销毁?如果它导致循环怎么办?系统应该如何跟踪所有这些?可能的好处值得麻烦吗?

    可能不会,因为语言标准明确决定不定义这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      相关资源
      最近更新 更多