静态破坏本地静态对象

时间:2012-04-27 15:31:32

标签: c++ static local termination destruction

帮助我理解这一点......看到大胆。从标准3.6.3终止(2)

  

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

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对象被破坏,然后再次调用该函数(创建新静态或不创建),这是未定义的吗?看起来它为已定义的行为留下了空间,但是如果它通过了被破坏对象的定义则不是。

任何人都清楚地了解这一点吗?

1 个答案:

答案 0 :(得分:2)

我相信这里的关键词是

  

创建新的静态

如果在破坏静态对象期间发生这种情况,并且会导致重新创建一些已经被破坏的静态对象,那么何时它们会被销毁?如果它导致循环怎么办?系统应该如何跟踪所有这些?这些可能带来的好处值得吗?

可能不是,因为语言标准明确决定不定义它。