SCOPE_EXIT,your friend of resource management

raii是C++资源管理中的主要手段。folly中提供了SCOPE_EXIT SCOPE_FAIL SCOPE_SUCCESS三个宏,可以方便的实现raii。

#include <iostream>
#include <gtest/gtest.h>
#include <folly/ScopeGuard.h>

TEST(raii, scope_exit)
{
  int i = 0;
  {
    SCOPE_EXIT { i++; };//指定退出作用域时执行的语句
    EXPECT_EQ(i, 0);
  }
  EXPECT_EQ(i, 1);
}
void foo(int &i)
{
  SCOPE_SUCCESS { ++i ;};//指定函数成功返回时,退出作用域时执行的语句
  return;
}
void fail(int &i)
{
  SCOPE_FAIL { ++i ;};//指定函数抛异常时,退出作用域时执行的语句
  throw 1;
}
TEST(raii, scope_success)
{
  int i = 0;
  {
    foo(i);
  }
  EXPECT_EQ(i, 1);
}
TEST(raii, scope_fail)
{
  int i = 0;
  try
  {
    fail(i);
  }
  catch (...)
  {
     EXPECT_EQ(i, 1);
  }
}
TEST(raii, two_scope_exit)
{
  int i = 1;
  {
  SCOPE_EXIT { i++; }; //SCOPE_EXIT可多次重复使用,类似析构函数,第二个SCOPE_EXIT中的语句先执行
  SCOPE_EXIT { i*=5; }; 
  }
  EXPECT_EQ(i, 6);
}
Posted 2023-05-17