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?

標準では、odr-use ルールで静的に作成されたローカルの static localMan オブジェクトが破棄され、関数が再度呼び出された場合 (新しい static を作成するかどうかにかかわらず)、これは未定義であると言っていますか? 定義された動作があるように見えますが、破壊されたオブジェクトの定義を通過する場合はそうではありません。

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

4

1 に答える 1

2

ここでのキーフレーズは

新しい静的を作成するかどうか

これが静的オブジェクトの破棄中に発生し、既に破棄された静的オブジェクトの一部が再作成される場合、それらはいつ破棄されますか? ループが発生した場合はどうなりますか? システムはこれらすべてをどのように追跡しているのでしょうか? 考えられるメリットは、トラブルに見合うだけの価値がありますか?

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

于 2012-04-27T16:04:02.140 に答える