我有两个全局变量:
static mutex m;
static object o;
和破坏| o |需要使用| n |
~object() {
auto_lock(&m);
}
但是,我发现有时候| m |已被破坏。我想知道全局变量破坏的顺序?
总是以相反的构造顺序调用析构函数。但是如果两个变量都位于不同的编译单元中,那么很难分辨哪个变量将首先被构造。但是,如果您的变量位于单个编译单元中,那么您应该是安全的。
参考文献:https://en.cppreference.com/w/cpp/language/destructor https://isocpp.org/wiki/faq/ctors#static-init-order
静态对象以相反的构造顺序被破坏但是很难(并且几乎不可能)控制该顺序。
如果您需要更多控制,您可能希望将它们包含在某个结构中。
struct EnsureOrder {
mutex m;
object o;
};
static EnsureOrder wrapper;
如果这两个对象在同一个.cpp
文件中,我很确定该对象应该按照它们的定义顺序构造。
您可以使用引用计数和自毁方法 - 在堆上创建m
和o
并将它们包装到某种引用计数和销毁容器中。因此,当你创建o
时,你应该增加m
上的引用计数,当你破坏o
时,你应该减少m
上的引用计数。因此,您可以控制全局变量的构造/销毁顺序。希望这可以帮助。
这个问题可以通过依赖注入来解决(即将互斥体声明为main中的第一个并将其传递给object的构造函数)。