// RAII
#include <iostream>
#include <stdio.h>
#include <stdexcept>
using namespace std;
void f();
// use an object to represent a resource
class File_handle { // belongs in some support library
FILE* p;
public:
File_handle(const char* pp, const char* r) {
p = fopen(pp,r);
// Commented out for running on Ideone.com
// if (p==0) throw std::runtime_error("File_error{pp,r}");
}
File_handle(const string& s, const char* r) {
p = fopen(s.c_str(),r);
// Commented out for running on Ideone.com
//if (p==0) throw std::runtime_error("File_error{s,r}");
}
~File_handle() {
cout << "fclose() called in File_handle" << endl;
fclose(p);
} // destructor
// copy operations
// access functions
};
struct A
{
~A() {
cout << "~A() called" << endl;
};
};
void good (string s) {
File_handle fh (s, "r");
// use fh
f(); // OOPS!
}
void bad(const char* p)
{
FILE* fh = fopen(p,"r"); // acquire
// use f
f(); // OOPS!
fclose(fh); // release
cout << "fclose() called" << endl;
}
void f()
{
A a;
throw 42;
}
int main() {
try
{
// Try either of these
//f();
//bad("c:\\temp\\1.txt");
//good("c:\\temp\\1.txt");
}
catch ( ... ) {}
return 0;
}
Ly8gUkFJSSAKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIGYoKTsKCi8vIHVzZSBhbiBvYmplY3QgdG8gcmVwcmVzZW50IGEgcmVzb3VyY2UKY2xhc3MgRmlsZV9oYW5kbGUgeyAvLyBiZWxvbmdzIGluIHNvbWUgc3VwcG9ydCBsaWJyYXJ5CiAgICBGSUxFKiBwOwpwdWJsaWM6CglGaWxlX2hhbmRsZShjb25zdCBjaGFyKiBwcCwgY29uc3QgY2hhciogcikgewoJCXAgPSBmb3BlbihwcCxyKTsKCQkvLyBDb21tZW50ZWQgb3V0IGZvciBydW5uaW5nIG9uIElkZW9uZS5jb20KICAgICAgICAvLyBpZiAocD09MCkgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJGaWxlX2Vycm9ye3BwLHJ9Iik7Cgl9CiAgICAKCUZpbGVfaGFuZGxlKGNvbnN0IHN0cmluZyYgcywgY29uc3QgY2hhciogcikgewogICAgICAgIHAgPSBmb3BlbihzLmNfc3RyKCkscik7CiAgICAgICAgLy8gQ29tbWVudGVkIG91dCBmb3IgcnVubmluZyBvbiBJZGVvbmUuY29tCiAgICAgICAgLy9pZiAocD09MCkgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJGaWxlX2Vycm9ye3Mscn0iKTsKCX0KICAgIAoJfkZpbGVfaGFuZGxlKCkgewogICAgICAgIGNvdXQgPDwgImZjbG9zZSgpIGNhbGxlZCBpbiBGaWxlX2hhbmRsZSIgPDwgZW5kbDsKCQlmY2xvc2UocCk7Cgl9IC8vIGRlc3RydWN0b3IKCS8vIGNvcHkgb3BlcmF0aW9ucwoJLy8gYWNjZXNzIGZ1bmN0aW9ucwp9OwoKc3RydWN0IEEKewogICAgfkEoKSB7CiAgICAgICAgY291dCA8PCAifkEoKSBjYWxsZWQiIDw8IGVuZGw7CiAgICB9Owp9OwoKdm9pZCBnb29kIChzdHJpbmcgcykgewogICAgRmlsZV9oYW5kbGUgZmggKHMsICJyIik7CiAgICAvLyB1c2UgZmgKICAgIGYoKTsgLy8gT09QUyEKfQoKdm9pZCBiYWQoY29uc3QgY2hhciogcCkKewogICAgRklMRSogZmggPSBmb3BlbihwLCJyIik7IC8vIGFjcXVpcmUKCS8vIHVzZSBmCglmKCk7IC8vIE9PUFMhCglmY2xvc2UoZmgpOyAvLyByZWxlYXNlCiAgICBjb3V0IDw8ICJmY2xvc2UoKSBjYWxsZWQiIDw8IGVuZGw7Cn0KCnZvaWQgZigpCnsKCUEgYTsKCXRocm93IDQyOwp9CgppbnQgbWFpbigpIHsKCgl0cnkKCXsKICAgICAgICAvLyBUcnkgZWl0aGVyIG9mIHRoZXNlCgkJLy9mKCk7CgkJLy9iYWQoImM6XFx0ZW1wXFwxLnR4dCIpOwogICAgICAgIC8vZ29vZCgiYzpcXHRlbXBcXDEudHh0Iik7Cgl9CgljYXRjaCAoIC4uLiApIHt9CgkKCXJldHVybiAwOwp9