【发布时间】: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