BOOST_SCOPE_EXIT幕后做什么

What does BOOST_SCOPE_EXIT do behind the scenes?

本文关键字:什么 EXIT SCOPE BOOST      更新时间:2023-10-16

为了了解作用域退出块相对于自动变量的释放将在哪里执行,我编写了这个程序:

#include <boost/scope_exit.hpp>
#include <iostream>
class A
{
  public:
    A()
    {
        std::cout << "A's constructor" << std::endl;
    }
    ~A()
    {
        std::cout << "A's destructor" << std::endl;
    }
};
class B
{
  public:
    B()
    {
        std::cout << "B's constructor" << std::endl;
    }
    ~B()
    {
        std::cout << "B's destructor" << std::endl;
    }
};
int main()
{
    A a;
    BOOST_SCOPE_EXIT()
    {
        std::cout << "Scope exit 1" << std::endl;
    } BOOST_SCOPE_EXIT_END
    B b;
    BOOST_SCOPE_EXIT()
    {
        std::cout << "Scope exit 2" << std::endl;
    } BOOST_SCOPE_EXIT_END
    std::cout << std::endl;
    return 0;
}

输出如下:

A's constructor
B's constructor
Scope exit 2
B's destructor
Scope exit 1
A's destructor

自动变量和作用域退出块之间有一个共同的顺序。我想知道提升是如何实现这一目标的?BOOST_SCOPE_EXIT宏是否在堆栈上创建一个对象,其析构函数执行退出块?

你的怀疑是对的。它创建一个对象,其析构函数执行块。从文档中:

警告:实现在析构函数中执行作用域退出主体,因此作用域出口主体绝不能抛出,以符合 STL 异常安全要求。

作为旁注,在 C++11 中,我个人更喜欢基于范围保护习惯用法的帮助程序类,该辅助类执行 lambda 函数而不是提升宏。这对我来说似乎更干净,并且可能会更容易发现实际发生的事情。

BOOST_SCOPE_EXIT最终确实会创建一个局部变量,其析构函数包含您的代码。析构函数以反向构造顺序执行,因此您的退出处理程序将自下而上执行,其他对象销毁交错执行。