BOOST_SCOPE_EXIT在幕后做了什么?

时间:2016-03-10 14:46:29

标签: c++ boost

尝试了解范围出口块在自动变量方面的执行位置' deallocations,我写了这个程序:

#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宏是否在析构函数执行出口块的堆栈上创建了一个对象?

2 个答案:

答案 0 :(得分:3)

你对自己的怀疑是正确的。它创建一个析构函数执行块的对象。来自the docs

  

警告:实现在析构函数中执行范围出口体,因此范围出口体必须永远不要抛出以符合STL异常安全要求。

作为旁注,在C ++ 11中,我个人更喜欢基于the scope guard idiom的辅助类,它对boost宏执行lambda函数。这对我来说似乎更清洁,并且可能会更容易发现实际发生的事情。

答案 1 :(得分:1)

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