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 される }