【问题标题】:C++ static member initialization orderC++静态成员初始化顺序
【发布时间】:2015-01-06 19:33:36
【问题描述】:

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

有两个类,AB

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

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

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

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

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

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

【问题讨论】:

  • "悲剧的是你有50%-50%的几率死去"C++ FAQ
  • @Shan:与正常的 100% 死亡几率相比,这很好。我会抓住机会的! :-)

标签: c++


【解决方案1】:

初始化分为三个部分,零初始化, 静态初始化和动态初始化。 (零 初始化实际上是静态初始化的一部分,但是 将它们分开通常很方便。)它们发生在 那个顺序。

如果您没有为static B* A::pb; 指定任何初始化, 它将被零初始化(在其他任何事情之前),并且什么都没有 别的。如果你指定一个常量初始化器,例如

B* A::pb = nullptr;

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

在构造函数中发生的是动态初始化,所以 你的代码应该没有问题,除非A::pb 也 具有动态初始化,例如:

B* A::pb = someFunctionReturningABStar();

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

当然,在构造 B::instance 之前,任何其他 代码将在A::pb 中看到一个空指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多