-1

ロックを解放するためにデストラクタに依存する SW で、このコードを見つけました。しかし、プログラムを実行すると、デストラクタが呼び出されず、ロックが解放されませんでした。

bool someClass::someFunc()
{
    Locker lock(m_lock); //take lock in constructor, release lock in Locker destructor
    return something;
}

ここで何がうまくいかないのですか?コンパイラはこの関数をインラインに最適化できますか?

class Locker {
  public: 
      Locker(Lock& lock) : m_lock(lock) { m_lock.lock(); }
     ~Locker() { m_lock.unlock(); } 
  protected: 
    Lock& m_lock;
}
4

2 に答える 2

2

デストラクタが呼び出されないというあなたの観察は間違っていると思います。これを一度だけ証明する方法は次のとおりです。

#include<iostream>

class Locker {
  public: 
      Locker(Lock& lock) : m_lock(lock) { m_lock.lock(); std::cout<<"locked\n"; }
     ~Locker() { m_lock.unlock(); std::cout<<"unlocked\n"; } 
  protected: 
    Lock& m_lock;
}

もちろん、これはデストラクタが呼び出されていることを確認するためのものです。そこに行を残さないでください:)

于 2013-03-06T02:24:47.093 に答える
2

Locker がデストラクタで実際にロックを解除することは確かですか? プログラムがクラッシュまたは中止するか、その他の異常な状況が発生しない限り、デストラクタが呼び出されることを期待できます。デバッガーが間違った値を表示している可能性がありますか?

コンパイラがインラインで最適化した場合でも、コードは実行されます。「インライン」とは、コードが決して実行されないという意味ではありません。

于 2013-03-06T02:00:06.617 に答える