私が書きたいのは次のようなものです
void foo()
{
int a = 5;
ExecuteOnUnwind eou(bind(&cleanupFunc, a));
}
cleanupFunc(a)
関数が戻るか、例外がスローされたときに呼び出されるようなものです。私のためにこれを行う機能がすでに利用可能ですか?Google に適切なフレーズを見つけることができませんでしたが、おそらくこれを行う何かがそこにあるようです. そうでない場合は、すぐに以下の解決策をまとめます。奇妙なことに、リリース モードでは動作しないように見えますが、vc10 のデバッグでは動作します。一時的な呼び出しを追加する危険を冒すことなく、両方で一貫して動作するように実装を微調整するにはどうすればよいですか?
編集:修正には、shared_ptr の使用が含まれます。一時的な破損の心配も軽減します。新しいコードは以下です
template <typename T>
struct ExecuteOnUnwindHelper
{
ExecuteOnUnwindHelper(const T & _functor) : mFunctor(_functor)
{
}
~ExecuteOnUnwindHelper()
{
mFunctor();
}
const T & mFunctor;
};
template <typename T>
boost::shared_ptr<ExecuteOnUnwindHelper<T>> ExecuteOnUnwind(const T & _functor)
{
return boost::shared_ptr<ExecuteOnUnwindHelper<T>>(new ExecuteOnUnwindHelper<T>(_functor));
}
void cleanupFunc(int a)
{
wcout << L"cleanup" << endl;
}
void foo()
{
int a = 5;
auto eou = ExecuteOnUnwind(boost::bind(&cleanupFunc, 5));
}
int main()
{
foo();
return 0;
}