BOOST_SCOPE_EXIT幕后做什么
What does BOOST_SCOPE_EXIT do behind the scenes?
为了了解作用域退出块相对于自动变量的释放将在哪里执行,我编写了这个程序:
#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最终确实会创建一个局部变量,其析构函数包含您的代码。析构函数以反向构造顺序执行,因此您的退出处理程序将自下而上执行,其他对象销毁交错执行。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- exit(0) 和 raise(SIGTERM) 有什么区别?
- 什么时候在 c++ 中使用 exit() 与异常更好?
- 如果在C++中,具有自动存储的对象没有通过调用exit来销毁,那么在离开程序后,这些对象会发生什么
- 如果在其他线程仍在运行时调用exit(0),会发生什么情况
- 在C++中,exit和std::exit之间有什么区别