-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

您确定 Locker 实际上释放了析构函数中的锁吗?除非程序崩溃或中止或发生其他一些不寻常的情况,否则您可以指望调用析构函数。也许您的调试器显示了错误的值?

如果编译器对其进行内联优化,代码仍将被执行。“内联”并不意味着代码永远不会运行。

于 2013-03-06T02:00:06.617 回答
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 回答