C ++静态成员初始化顺序

时间:2015-01-06 08:48:54

标签: c++

我有一段已经使用了很长时间的代码,其代码如下。

有两个类,AB

A类有一个公共静态变量static B* pB;

B类有一个静态对象(static B instance;)。

B构造函数中,我设置了A::pB = this;

我的问题是,由于静态变量初始化顺序未定义,如果b::instanceA::pB之前初始化,则首先调用B构造函数并尝试设置A::pB这是未初始化的,是否会导致问题?

我当前的代码运行时没有任何意外行为。想知道这是不是我的运气

A::pBB::instance的初始化发生在不同的翻译单元中)

1 个答案:

答案 0 :(得分:3)

初始化有三个部分,零初始化, 静态初始化和动态初始化。 (零 初始化实际上是静态初始化的一部分,但是 保持它们分开通常很方便。)它们发生在 那个命令。

如果您没有为static B* A::pb;指定任何初始化, 它将被初始化为零(在其他任何东西之前),什么也没有 其他。如果指定常量初始值设定项,例如

B* A::pb = nullptr;

,这也将在任何动态初始化之前发生。

构造函数中发生的是动态初始化,所以 除非A::pb,否则您的代码应该没有问题 有动态初始化,如:

B* A::pb = someFunctionReturningABStar();

最后:指针的默认构造函数是微不足道的;该 指针有效地构建了#34;程序加载时, 在执行任何代码之前。所以永远不会有问题 由于在构造函数中分配给pB。唯一的问题 如果有指针的动态初始化,可能会发生, 这可能发生在构造函数中的赋值之后 B::instance,并覆盖它。

当然,直到B::instance构建,任何其他 代码将在A::pb中看到空指针。