1

帮助我理解这一点......看粗体。从标准 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()
{
   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 对象被破坏,然后再次调用该函数(是否创建新的静态),这是未定义的?看起来它为定义的行为留出了空间,但如果它通过了被破坏对象的定义,则不是。

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

4

1 回答 1

2

我相信这里的关键词是

是否创建一个新的静态

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

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

于 2012-04-27T16:04:02.140 回答