C++0x ScopeGuard + Lambda Expression

C++ には ScopeGuard というイディオムがあります


ScopeGuard とは、関数内での簡易デストラクタのようなもので

スコープを抜けた際に実行する関数を指定することができます


ScopeGuard は、 Boost C++ Libraries で提供されています

#include <cstdio>
#include <boost/multi_index/detail/scope_guard.hpp>

using namespace boost::multi_index::detail;

int main()
{
    FILE *fp = fopen("./a.txt", "rb");
    scope_guard guard = make_guard(fclose, fp);

    // fp を使った処理...

    return 0; // ←ここで fclose される
}


C++0x にはラムダ式があるので、 ScopeGuard と組み合わせることでリソース管理がより簡単になるはず

#include <cstdio>
#include <boost/multi_index/detail/scope_guard.hpp>

using namespace std;
using namespace boost::multi_index::detail;

int main()
{
    FILE *fp = fopen("./a.txt", "rb");
    scope_guard guard = make_guard([&fp](){ fclose(fp); });

    // fp を使った処理...

    return 0; // ここで fclose される
}