C++控制全局对象的析构函数顺序

Fir*_*cer 4 c++ destructor memory-management global-variables

我有一个类(A)在其构造函数和析构函数中访问(间接通过静态方法)另一个类(B)中的静态变量(STL容器).

对象可以是全局的,全局常量,另一个类的静态成员,存储在其他类(可能本身具有全局或静态实例)中,或者基本上可以是c ++对象的任何其他位置.

如果A对象在B中的静态成员之前构造或在B中的静态成员之后被破坏,则会在某些时候导致崩溃(通常是访问冲突).

有没有一些方法,以保证(除了那些已经泄漏,因为按照定义,"迷失"等不会被破坏任何方式)A类的所有实例构造之后和在B的静态变量破坏?

我已经看到了一些解决方案,用于使特定变量在另一个之前/之后被构造/销毁,但是不是给定类型的所有实例的一般情况,因此我不确定如何处理它.

GMa*_*ckG 9

不.这称为静态初始化惨败.在输入main之前构造对象的顺序是未指定的.唯一的保证就是它发生了.

你可以做的是懒惰初始化.这意味着在您使用它们之前不会初始化您的对象.如:

struct A { /* some data */ };
struct B { B(void){ /* get A's data */ } };

A& get_A(void)
{
    static A instance;
    return instance;
}

B& get_B(void)
{
    static B instance;
    return instance;
}
Run Code Online (Sandbox Code Playgroud)

您使用get_Aget_B获取全局实例.其中部分B用途A应该使用get_A,以及您的使用B应符合get_B.请注意,get_B在您的情况下是可选的.

B首次创建时会发生什么?(全局或函数中)构造函数将调用,get_A并且将在何处A创建.这让你控制事物的构造顺序.

注意我想我颠倒了你的A和B.

  • @Neil:破坏顺序由初始化顺序决定. (4认同)
  • 他在询问破坏,而不是初始化. (2认同)