C ++中静态对象的销毁顺序

我可以控制销毁静态对象的顺序吗?有什么方法可以执行我想要的命令?例如,以某种方式指定我希望某个对象最后被破坏,或者至少在另一个静态对象之后被破坏?



缥缈止盈
浏览 731回答 3
3回答

料青山看我应如是

静态对象以相反的顺序破坏。而且施工顺序很难控制。您唯一可以确定的是,将按定义顺序构造在同一编译单元中定义的两个对象。其他任何事物或多或少都是随机的。

慕沐林林

对此的其他答案坚持认为它无法完成。他们是对的,依据规范-但有是一招,可以让你做到这一点。仅创建一个单一的静态变量,它包含了所有其他的事情,你通常会做静态变量,像这样一类或结构的,:class StaticVariables {    public:    StaticVariables(): pvar1(new Var1Type), pvar2(new Var2Type) { };    ~StaticVariables();    Var1Type *pvar1;    Var2Type *pvar2;};static StaticVariables svars;您可以按所需的顺序创建变量,更重要的是,可以按所需的顺序破坏变量,方法是在的构造函数和析构函数中StaticVariables。为了使其完全透明,您也可以创建对变量的静态引用,如下所示:static Var1Type &var1(*svars.var1);Voilà-完全控制。:-)也就是说,这是额外的工作,通常是不必要的。但是,当有必要时,了解它非常有用。

蝴蝶刀刀

静态对象的破坏顺序与生成它们的顺序相反(例如,第一个破坏的对象最后被破坏),您可以使用第47条中所述的技术来控制静态对象的生成顺序,在Meyers的书《Effective C ++》中“ 确保在使用全局对象之前对其进行了初始化 ” 。例如,以某种方式指定我希望某个对象最后被破坏,或者至少在另一个静态注入之后被破坏?确保在其他静态对象之前构造它。如何控制施工顺序?并非所有的静态函数都在同一个dll中。为了简单起见,我将忽略它们不在同一个DLL中的事实。我对迈耶斯项目47(长4页)的解释如下。假设您在这样的头文件中定义了全局变量...//GlobalA.hextern GlobalA globalA; //declare a global...向这样的包含文件添加一些代码...//GlobalA.hextern GlobalA globalA; //declare a globalclass InitA{  static int refCount;public:  InitA();  ~InitA();};static InitA initA;这样做的结果是,任何包含GlobalA.h的文件(例如,定义了第二个全局变量的GlobalB.cpp源文件)都将定义InitA类的静态实例,该实例将在该实例中的其他任何对象之前进行构造源文件(例如,在第二个全局变量之前)。该InitA类具有静态引用计数器。当构造第一个InitA实例时(现在可以保证在构造GlobalB实例之前),InitA构造函数可以执行其必须做的一切以确保初始化globalA实例。
打开App,查看更多内容
随时随地看视频慕课网APP