2012-04-27 18 views
1

これを理解するのを助けてください...太字を参照してください。標準3.6.3終端から(2)ローカル静的オブジェクトの静的な破棄

2機能が破壊された静的又はスレッド 貯蔵期間のブロックスコープのオブジェクトが含まれている場合と機能は、オブジェクトの破壊との間 と呼ばれ静的またはスレッド記憶域 の間に、コントロール の流れが、以前に破壊されたブロックスコープ オブジェクトの定義を通過すると、プログラムはの不確定な振る舞いをします。同様に、ブロックスコープオブジェクト が破壊後に間接的に(すなわちポインタを介して)使用される場合、その動作は不確定である。

Manager& GetManager() 
{ 
    static Manager localMan; 
    return localMan; 
} 

そして、どこか別の場所に...

{ 
    static User localUser; 
    localUser.DoSomething(); //localUser calls GetManager and uses the reference returned. 
} 

は、ユーザーのデストラクタで...

User::~User() 
{ 
    GetManager().DoSomethingOneLastTime(); 
} 

//Now lets say Main exits and static destruction begins. 
//Somehow localMan is destructed before User. 
//Then user calls the GetManager() function in it's destructor. 
//What case is this defined, and what case makes this undefined? 

はた場合は、ローカル静的localManオブジェクトという規格です静的に作成されたodr-useルールが破棄され、関数が再度呼び出されました(新しい静的なものかどうかを確認する)。それは定義された動作があるために余裕を残しているように見えますが、破壊されたオブジェクトの定義を通過する場合、それはそうではありません。

誰もがこれについて明確な洞察力を持っていますか?

答えて

2

私はここでのキーフレーズが、これは静的オブジェクトの破壊時に発生し、すでに破壊された静的のいくつかのレクリエーションを引き起こす場合

新しい静的か

を作成

であると考えていますオブジェクトは、いつ彼らは破壊される?もしそれがループを引き起こすなら、どうでしょうか?システムはこれをどのように追跡していますか?トラブルに見合う価値のあるメリットはありますか?

おそらく、言語標準ではこれを定義しないことを明示的に決めているためです。

関連する問題