#include <iostream>
#include <ostream>
using namespace std;
struct Example
{
virtual void virtualfunction()=0;
virtual ~Example() {}
};
struct Implmenetation : Example
{
bool alive;
Implmenetation() : alive(true) {}
void virtualfunction()
{
cout << "Implmenetation::virtualfunction alive=" << alive << endl;
}
~Implmenetation()
{
alive=false;
cout << "Implmenetation::~Implmenetation" << endl;
}
};
struct Forwarder : Example
{
Example *impl;
Forwarder(Example *i) : impl(i) {}
void virtualfunction()
{
impl->virtualfunction();
}
};
void codeIDontControl(Example *ex)
{
ex->virtualfunction();
delete ex;
}
void myCode()
{
Implmenetation impl;
codeIDontControl(new Forwarder(&impl));
//do something with ex //doesn't work because ex has been freed
impl.virtualfunction();
}
int main()
{
myCode();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8b3N0cmVhbT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgRXhhbXBsZQp7CiAgICB2aXJ0dWFsIHZvaWQgdmlydHVhbGZ1bmN0aW9uKCk9MDsKICAgIHZpcnR1YWwgfkV4YW1wbGUoKSB7fQp9OwoKc3RydWN0IEltcGxtZW5ldGF0aW9uIDogRXhhbXBsZQp7CiAgICBib29sIGFsaXZlOwogICAgSW1wbG1lbmV0YXRpb24oKSA6IGFsaXZlKHRydWUpIHt9CiAgICB2b2lkIHZpcnR1YWxmdW5jdGlvbigpCiAgICB7CiAgICAgICAgY291dCA8PCAiSW1wbG1lbmV0YXRpb246OnZpcnR1YWxmdW5jdGlvbiBhbGl2ZT0iIDw8IGFsaXZlIDw8IGVuZGw7CiAgICB9CiAgICB+SW1wbG1lbmV0YXRpb24oKQogICAgewogICAgICAgIGFsaXZlPWZhbHNlOwogICAgICAgIGNvdXQgPDwgIkltcGxtZW5ldGF0aW9uOjp+SW1wbG1lbmV0YXRpb24iIDw8IGVuZGw7CiAgICB9Cn07CgpzdHJ1Y3QgRm9yd2FyZGVyIDogRXhhbXBsZQp7CiAgICBFeGFtcGxlICppbXBsOwogICAgRm9yd2FyZGVyKEV4YW1wbGUgKmkpIDogaW1wbChpKSB7fQogICAgdm9pZCB2aXJ0dWFsZnVuY3Rpb24oKQogICAgewogICAgICAgIGltcGwtPnZpcnR1YWxmdW5jdGlvbigpOwogICAgfQp9OwoKdm9pZCBjb2RlSURvbnRDb250cm9sKEV4YW1wbGUgKmV4KQp7CiAgICAgZXgtPnZpcnR1YWxmdW5jdGlvbigpOwogICAgIGRlbGV0ZSBleDsKfQoKdm9pZCBteUNvZGUoKQp7CiAgICBJbXBsbWVuZXRhdGlvbiBpbXBsOwoKICAgIGNvZGVJRG9udENvbnRyb2wobmV3IEZvcndhcmRlcigmaW1wbCkpOwogICAgLy9kbyBzb21ldGhpbmcgd2l0aCBleCAvL2RvZXNuJ3Qgd29yayBiZWNhdXNlIGV4IGhhcyBiZWVuIGZyZWVkCiAgICBpbXBsLnZpcnR1YWxmdW5jdGlvbigpOwp9CmludCBtYWluKCkKewogICAgbXlDb2RlKCk7Cn0K