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

问题描述:

我有两个全局变量:命令C++全局变量破坏?

static mutex m; 
static object o; 

和自毁| O |需要使用| n |

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

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

+0

向我们展示更多代码。 – Losiowaty

+1

“我发现[它]已被破坏”。你是怎么发现的? – JBL

+0

'struct MyStruct {mutex m;对象o; }'然后是一个全局的MyStruct实例,并且您已设置。但是,我怀疑你*真的需要全球性的 – stijn

破坏者总是以相反的顺序被调用。但是,如果两个变量都位于不同的编译单元中,那么很难判断哪个变量会先构建。但是如果你的变量位于单个编译单元中,那么你应该是安全的。

+0

我明白了。谢谢。 – wppiwyye

静态物体以相反的构造顺序被破坏但是控制该命令是非常困难的(而且几乎是不可能的)。

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

struct EnsureOrder { 
    mutex m; 
    object o; 
}; 

static EnsureOrder wrapper; 

如果这两个对象都在同一.cpp文件我敢肯定的对象应该在他们被定义的顺序来构建。

+0

它使m和o静态没有意义,这将有相同的问题 – stijn

+0

对不起,我忘了删除'静态'。 –

+0

这将是一个好主意。谢谢。 – wppiwyye

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

+0

谢谢你的帮助。我会尝试。 – wppiwyye

这个问题可以通过依赖注入来解决(例如,声明互斥量作为主要的第一件事,并将它传递给对象的构造函数)。