C ++全局变量命令的破坏?

时间:2014-01-13 09:33:32

标签: c++ destructor

我有两个全局变量:

static mutex m;
static object o;

和destruct | o |需要使用| n |

~object() {
  auto_lock(&m);
}

但是,我发现有时候| m |已被破坏。 我想知道全局变量破坏的顺序?

4 个答案:

答案 0 :(得分:3)

总是以相反的构造顺序调用析构函数。但是如果两个变量都位于不同的编译单元中,那么很难分辨哪个变量将首先被构造。但是如果你的变量位于单个编译单元中,那么你应该是安全的。

参考文献: https://en.cppreference.com/w/cpp/language/destructor https://isocpp.org/wiki/faq/ctors#static-init-order

答案 1 :(得分:0)

静态对象以相反的构造顺序被破坏但是控制该顺序非常困难(并且几乎不可能)。

如果您需要更多控制权,可能需要将它们包含在某个结构中。

struct EnsureOrder {
    mutex m;
    object o;
};

static EnsureOrder wrapper;

如果这两个对象在同一个.cpp文件中,我很确定该对象应该按照它们的定义顺序构建。

答案 2 :(得分:0)

您可以使用引用计数和自毁方法 - 在堆上创建mo并将它们包装到某种引用计数和销毁容器中。因此,当您创建o时,您应该增加m上的引用计数,当您破坏o时,您应该减少m上的引用计数。因此,您可以控制全局变量的构造/销毁顺序。希望这会有所帮助。

答案 3 :(得分:0)

这个问题可以通过依赖注入来解决(即将互斥体声明为main中的第一个东西并将其传递给对象的构造函数)。