#include <string>
#include <stdexcept>
#include <iostream>
using namespace std;
class throwsecond
{
static int count;
public:
throwsecond(const string &)
{
if (count ++)
{
count = 0;
throw runtime_error("Kaboom!");
}
cout << "Constructed\n";
}
~throwsecond()
{
cout << "Destructed\n";
}
};
int throwsecond::count = 0;
class bad_example
{
throwsecond * a;
throwsecond * b;
public:
bad_example(): a(nullptr), b(nullptr)
{
}
bad_example (const string& a,
const string& b)
{
this->a = new throwsecond(a);
this->b = new throwsecond(b);
}
~bad_example()
{
delete a;
delete b;
}
};
class good_example
{
throwsecond * a;
throwsecond * b;
public:
good_example(): a(nullptr), b(nullptr)
{
}
good_example (const string& a,
const string& b) : good_example{}
{
this->a = new throwsecond(a);
this->b = new throwsecond(b);
}
~good_example()
{
delete a;
delete b;
}
};
int main()
{
cout << "Bad example\n";
try
{
bad_example("", "");
}
catch (...)
{
cout << "Caught exception\n";
}
cout << "Good example\n";
try
{
good_example("", "");
}
catch (...)
{
cout << "Caught exception\n";
}
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgdGhyb3dzZWNvbmQKewogICAgc3RhdGljIGludCBjb3VudDsKcHVibGljOgogICAgdGhyb3dzZWNvbmQoY29uc3Qgc3RyaW5nICYpCiAgICB7CiAgICAgICAgaWYgKGNvdW50ICsrKQogICAgICAgIHsKICAgICAgICAgICAgY291bnQgPSAwOwogICAgICAgICAgICB0aHJvdyBydW50aW1lX2Vycm9yKCJLYWJvb20hIik7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgIkNvbnN0cnVjdGVkXG4iOwogICAgfQogICAgfnRocm93c2Vjb25kKCkKICAgIHsKICAgICAgICBjb3V0IDw8ICJEZXN0cnVjdGVkXG4iOwogICAgfQp9OwoKaW50IHRocm93c2Vjb25kOjpjb3VudCA9IDA7CgpjbGFzcyBiYWRfZXhhbXBsZQp7CiAgICB0aHJvd3NlY29uZCAqIGE7CiAgICB0aHJvd3NlY29uZCAqIGI7CnB1YmxpYzoKICAgIGJhZF9leGFtcGxlKCk6IGEobnVsbHB0ciksIGIobnVsbHB0cikKICAgIHsKICAgIH0KICAgIGJhZF9leGFtcGxlIChjb25zdCBzdHJpbmcmIGEsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBiKQogICAgewogICAgICAgIHRoaXMtPmEgPSBuZXcgdGhyb3dzZWNvbmQoYSk7CiAgICAgICAgdGhpcy0+YiA9IG5ldyB0aHJvd3NlY29uZChiKTsKICAgIH0KICAgIH5iYWRfZXhhbXBsZSgpCiAgICB7CiAgICAgICAgZGVsZXRlIGE7CiAgICAgICAgZGVsZXRlIGI7CiAgICB9Cn07CgpjbGFzcyBnb29kX2V4YW1wbGUKewogICAgdGhyb3dzZWNvbmQgKiBhOwogICAgdGhyb3dzZWNvbmQgKiBiOwpwdWJsaWM6CiAgICBnb29kX2V4YW1wbGUoKTogYShudWxscHRyKSwgYihudWxscHRyKQogICAgewogICAgfQogICAgZ29vZF9leGFtcGxlIChjb25zdCBzdHJpbmcmIGEsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgYikgOiBnb29kX2V4YW1wbGV7fQogICAgewogICAgICAgIHRoaXMtPmEgPSBuZXcgdGhyb3dzZWNvbmQoYSk7CiAgICAgICAgdGhpcy0+YiA9IG5ldyB0aHJvd3NlY29uZChiKTsKICAgIH0KICAgIH5nb29kX2V4YW1wbGUoKQogICAgewogICAgICAgIGRlbGV0ZSBhOwogICAgICAgIGRlbGV0ZSBiOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBjb3V0IDw8ICJCYWQgZXhhbXBsZVxuIjsKICAgIHRyeQogICAgewogICAgICAgIGJhZF9leGFtcGxlKCIiLCAiIik7CiAgICB9CiAgICBjYXRjaCAoLi4uKQogICAgewogICAgICAgIGNvdXQgPDwgIkNhdWdodCBleGNlcHRpb25cbiI7CiAgICB9CiAgICBjb3V0IDw8ICJHb29kIGV4YW1wbGVcbiI7CiAgICB0cnkKICAgIHsKICAgICAgICBnb29kX2V4YW1wbGUoIiIsICIiKTsKICAgIH0KICAgIGNhdGNoICguLi4pCiAgICB7CiAgICAgICAgY291dCA8PCAiQ2F1Z2h0IGV4Y2VwdGlvblxuIjsKICAgIH0KfQo=