7

2 つのローカル オブジェクトがあるとします。関数が戻るとき、どちらが最初にスコープから出ることが保証されていますか?

例えば:

私はこのようなクラスを持っています:

class MutexLock
{
    /* Automatic unlocking when MutexLock leaves a scope */
    public:
      MutexLock (Mutex &m)      { M.lock();   }
      ~MutexLock(Mutex &m)      { M.unlock(); }
};

これは、スコープ外に出るときにミューテックスを自動的に解放するために使用される非常に一般的なトリックです。しかし、スコープ内に 2 つのミューテックスが必要な場合はどうすればよいでしょうか?

void *func(void *arg)
{ 
    MutexLock m1;
    MutexLock m2;

    do_work();

}  // m1 and m2 will get unlocked here. But in what order? m1 first or m2 first?

これにより、デッドロックが発生することはありません。ただし、リソースを解放する順序がユーザーにとって役立つ場合があります。その場合、デストラクタに頼るのではなく明示的にすることが重要ですか?

また、どのような場合でも、コンパイラによって破壊が遅れることはありますか? つまり、

func()

{

     {
         foo f();
     } ---------> Can compiler choose to not destroy f here, rather do it at the time when func() is returning. 
}
4

4 に答える 4

10

// m1 and m2 will get unlocked here. But in what order? m1 first or m2 first?

デストラクタは、構築の逆の順序で呼び出されm2ますm1

その場合、デストラクタに依存するのではなく、明示的にすることが重要ですか?

破壊の順序は、信頼できるように明確に指定されています。

また、どのような場合でも、コンパイラによって破棄を遅らせることができますか?

いいえ。そうすると、 RAIIベースのコードの多くが壊れてしまいます(MutexLockクラスはその良い例です)。

于 2012-05-15T06:32:41.367 に答える
2

破壊は建設の逆の順序で起こります:最初m2にそして次にm1

コンパイラは、スコープの終了()の背後でオブジェクトの存続期間を遅らせることはできません}

于 2012-05-15T06:34:10.037 に答える
0

オブジェクトがスコープ外になると、オブジェクトは常に破棄されます。これはJavaではありません。f指定した場所で破壊され、funcの終了時に破壊されることはありません。一般に、デストラクタは、構築の順序とは逆の順序で呼び出されます。

于 2012-05-15T06:34:46.630 に答える