// Complete program that illustrates the RAII idea. Does compile. // This version just reveals the resource allocation and deallocation on standard output. // Just a detailed setup that illustrates that the resource always is released - // in both normal return situations, and in exceptional situations. #include #include #include using namespace std; typedef string resource_id_t; typedef int resource_type; class Problem{}; class Resource{ private: resource_type r; resource_id_t rti; public: Resource(resource_id_t id): r(allocate_resource(id)), rti(id){ } ~Resource() { release_resource(rti); } private: resource_type allocate_resource(resource_id_t id){ cout << "Allocate resource: " << id << endl; return 1; } void release_resource(resource_id_t id){ r = 0; cout << flush << "Release resource: " << id << flush << endl; } }; void use_resource(resource_id_t r, bool problem_condition){ Resource res(r); // The constructor allocates the resource cout << "Use Resource" << endl; if (problem_condition){ cout << "An exception is thrown" << endl; throw Problem(); } // When the functions ends, or if an exception occurs before that, // the Resource destructor will be activated hereby relinquising it. }; int main(int argc, char *argv[]){ bool problem_condition = (argc >= 2) && (std::strcmp(argv[1],"problem") == 0); if (problem_condition) cout << "The program will throw an exception during use of resource" << endl; else cout << "The program will use resource without throwing an exception" << endl; try{ use_resource("sample_resource", problem_condition); } catch(Problem){ cout << "Recovering" << endl; } }