我们可以依赖析构函数多少钱?

时间:2013-03-06 01:56:29

标签: c++

我在SW中遇到了这段代码,它依赖于析构函数来释放Lock。但是当我运行程序时,析构函数从未被调用,锁定永远不会被释放。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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;
}

当然,这只是为了让自己满足于被调用析构函数。不要把线留在那里:)