私は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.
}
@ aixの回答の最初の部分をサポートするため、これは標準から抜粋したものです(ドラフト版、日付:2006-11-06 ---後のバージョンでは変更されていません)。 ): "スコープを終了すると(ただし達成された)、デストラクタは、そのスコープ内で宣言の逆の順序で宣言された自動保存期間(名前付きオブジェクトまたは一時的オブジェクト)を持つすべての構築済みオブジェクトに対して呼び出されます。もちろん、あなたの例には自動変数宣言が含まれています。 – sturmer