目录
背景
替代方案
方案一:利用C++11的Lamda表达式
方案二:利用C++11的共享指针(推荐)
背景
Boost库中的BOOST_SCOPE_EXIT宏用于在程序退出当前区块时执行指定操作,例如下面的代码
{
int * ptr = new int;
BOOST_SCOPE_EXIT(ptr) {
delete ptr;
std::cout << "Delete pointer" << std::endl;
} BOOST_SCOPE_EXIT_END
std::cout << "Exit scope" << std::endl;
}
上面这段代码的输出如下
Exit scope
Delete pointer
但Boost比较大,在项目中引入比较麻烦,所以有时候希望找到替代方案。
替代方案
方案一:利用C++11的Lamda表达式
利用C++11的Lamda表达式和类析构的特性可以实现替代。代码如下:
#include <functional>
#include <iostream>
using namespace std;
class ScopeGuard {
public:
ScopeGuard(function<void()> op) : m_op(op) {}
~ScopeGuard() {
if (m_op) m_op();
}
private:
function<void()> m_op;
};
int main()
{
ScopeGuard sg([]() {
cout << "scope guard destroy" << endl;
});
cout << "exit main" << endl;
}
这种方案需要自己定义ScopeGuard类不是很方便。
方案二:利用C++11的共享指针(推荐)
具体代码如下:
#include <memory>
#include <iostream>
using namespace std;
int main()
{
shared_ptr<void> spScpGuard(nullptr, [](void*) {
cout << "scope guard destroy" << endl;
});
cout << "exit main" << endl;
}
|