我们能在多大程度上依赖析构函数

how much can we rely on destructor?

本文关键字:依赖 析构函数 程度 我们      更新时间:2023-10-16

我在我们的软件中遇到了这段代码,它依赖析析函数来释放锁。然而,当我运行程序时,析构函数从未被调用,锁也从未被释放。

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

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

如果编译器将其内联优化,则代码仍将执行。"inline"并不意味着代码永远不会运行。

我怀疑你没有调用析构函数的观察是错误的。以下是如何一劳永逸地证明它的方法:

#include<iostream>
class Locker {
  public: 
      Locker(Lock& lock) : m_lock(lock) { m_lock.lock(); std::cout<<"lockedn"; }
     ~Locker() { m_lock.unlock(); std::cout<<"unlockedn"; } 
  protected: 
    Lock& m_lock;
}

当然,这只是为了让你确信析构函数正在被调用。不要在里面留行:)