亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 771 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號