有一个很好的常见问题解答(isocpp)只是说明了为什么我们可能不能使用静态对象而不是静态指针来避免 Fiasco 问题。我在答案中遇到了一个让我头疼的句子
.... 通过将声明从 更改
static X* xp = new X();
为static X xp;
,我们仍然可以正确处理初始化情况,但我们不再处理取消初始化情况。例如,如果有 3 个静态对象,比如 a、b 和 c,在它们的析构函数中使用 ans,那么避免静态去初始化灾难的唯一方法是 ifxp
在这三个对象之后都被销毁。
主文件
#include "x.h" // struct X { X(int); void f(); };
X& x(int i)
{
static X xp{ i };
return xp;
}
struct Y
{
Y(int);
private: int m_y;
};
Y::Y(int i) {
x(i).f();
}
其他.cpp
Y y{ 20 };
struct X {
X(int);
void f();
private: int m_x;
};
X::X(int j): m_x(j) {};
void X::f() { std::cout << m_x << std::endl; }
然后他们继续:
要点很简单:如果有任何其他静态对象的析构函数可能
xp
在xp
被破坏后使用,砰,你就死定了。
我只是无法理解这个问题是如何发生的。我需要一个实际的例子来说明这个问题是如何发生的。