为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
缥缈止盈 2019-12-02 12:53:29
我可以控制销毁静态对象的顺序吗?有什么方法可以执行我想要的命令?例如,以某种方式指定我希望某个对象最后被破坏,或者至少在另一个静态对象之后被破坏?
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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


查看完整回答
反对 回复 2019-12-02
?
慕沐林林

TA贡献2016条经验 获得超9个赞

对此的其他答案坚持认为它无法完成。他们是对的,依据规范-但有是一招,可以让你做到这一点。


仅创建一个单一的静态变量,它包含了所有其他的事情,你通常会做静态变量,像这样一类或结构的,:


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à-完全控制。:-)也就是说,这是额外的工作,通常是不必要的。但是,当有必要时,了解它非常有用。


查看完整回答
反对 回复 2019-12-02
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

静态对象的破坏顺序与生成它们的顺序相反(例如,第一个破坏的对象最后被破坏),您可以使用第47条中所述的技术来控制静态对象的生成顺序,在Meyers的书《Effective C ++》中“ 确保在使用全局对象之前对其进行了初始化 ” 。


例如,以某种方式指定我希望某个对象最后被破坏,或者至少在另一个静态注入之后被破坏?


确保在其他静态对象之前构造它。


如何控制施工顺序?并非所有的静态函数都在同一个dll中。


为了简单起见,我将忽略它们不在同一个DLL中的事实。


我对迈耶斯项目47(长4页)的解释如下。假设您在这样的头文件中定义了全局变量...


//GlobalA.h

extern GlobalA globalA; //declare a global

...向这样的包含文件添加一些代码...


//GlobalA.h

extern GlobalA globalA; //declare a global

class InitA

{

  static int refCount;

public:

  InitA();

  ~InitA();

};

static InitA initA;

这样做的结果是,任何包含GlobalA.h的文件(例如,定义了第二个全局变量的GlobalB.cpp源文件)都将定义InitA类的静态实例,该实例将在该实例中的其他任何对象之前进行构造源文件(例如,在第二个全局变量之前)。


该InitA类具有静态引用计数器。当构造第一个InitA实例时(现在可以保证在构造GlobalB实例之前),InitA构造函数可以执行其必须做的一切以确保初始化globalA实例。


查看完整回答
反对 回复 2019-12-02
  • 3 回答
  • 0 关注
  • 730 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信