Using BOOST_SCOPE_EXIT #include <boost/scope_exit.hpp> #include <iostream> int *foo() { int *i = new int{10}; BOOST_SCOPE_EXIT(&i) { delete i; i = 0; } BOOST_SCOPE_EXIT_END std::cout << *i << '\n'; return i; }
BOOST_SCOPE_EXIT( (&pInt) (&pFloat) )//以引用的形式进行变量捕获 { delete pInt; pInt = nullptr; delete pFloat; pFloat = nullptr; std::cout << __FUNCTION__ << std::endl; } BOOST_SCOPE_EXIT_END; std::stringstr("abc"); BOOST_SCOPE_EXIT( str )//以值传递的形式进行变量捕获 { ...
上述代码使用BOOST_SCOPE_EXIT,修改如下: #include <string>#include<memory>#include<cstdio>#include<boost/scope_exit.hpp>voidwrite_to_file(conststd::string&s) { std::FILE* file = fopen("hello-world.txt","a"); BOOST_SCOPE_EXIT(&file) { std::fclose(file); } BOOST_SCOPE_EXIT_END std:...
或者直接用 Boost.ScopeExit。 // umu/scope_exit.hpp #pragma once #include <functional> // C++11 namespace umu { class ScopeGuard { public: explicit ScopeGuard(std::function<void()> on_exit_scope) : on_exit_scope_(on_exit_scope), dismissed_(false) {} ~ScopeGuard() noexcept { if (...