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

问题描述 投票:1回答:4

我有两个全局变量:

static mutex m;
static object o;

和破坏| o |需要使用| n |

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

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

c++ destructor
4个回答
3
投票

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

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


0
投票

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

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

struct EnsureOrder {
    mutex m;
    object o;
};

static EnsureOrder wrapper;

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.