函数内具有静态或线程存储期的对象已析构,之后该函数又被调用并引用到已析构的对象
C++-Undefined-Behavior-12
示例:
// In T.cpp
void foo() {
static T sObj;
....
}
// In U.cpp
class U {
....
public:
~U() {
foo(); // Undefined behavior if ‘sObj’ is destructed
}
};
U gObj; // Problematic
当例中全局对象 gObj 析构时会调用 foo 函数,如果这时 foo 函数中的静态对象 sObj 已析构,会导致未定义的行为,gObj 与 sObj 的析构顺序在标准中是不确定的。
依据
ISO/IEC 14882:2003 3.6.3(2)-undefined
ISO/IEC 14882:2011 3.6.3(2)-undefined