我有两个全局变量:
static mutex m;
static object o;
和destruct | o |需要使用| n |
~object() {
auto_lock(&m);
}
但是,我发现有时候| m |已被破坏。 我想知道全局变量破坏的顺序?
答案 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)
您可以使用引用计数和自毁方法 - 在堆上创建m
和o
并将它们包装到某种引用计数和销毁容器中。因此,当您创建o
时,您应该增加m
上的引用计数,当您破坏o
时,您应该减少m
上的引用计数。因此,您可以控制全局变量的构造/销毁顺序。希望这会有所帮助。
答案 3 :(得分:0)
这个问题可以通过依赖注入来解决(即将互斥体声明为main中的第一个东西并将其传递给对象的构造函数)。