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.
}