我在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;
}
答案 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;
}
当然,这只是为了让自己满足于被调用析构函数。不要把线留在那里:)