我们能在多大程度上依赖析构函数
how much can we rely on destructor?
我在我们的软件中遇到了这段代码,它依赖析析函数来释放锁。然而,当我运行程序时,析构函数从未被调用,锁也从未被释放。
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;
}
当然,这只是为了让你确信析构函数正在被调用。不要在里面留行:)
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- 为什么构造函数调用依赖于默认析构函数的存在?
- 我们可以依赖基于内存布局和默认析构函数的任何保证吗?
- 循环数据依赖关系析构函数
- 我们能在多大程度上依赖析构函数