#include <iostream>
class Base
{
public:
Base() { std::cout << "Base" << std::endl; }
virtual ~Base() { std::cout << "~Base" << std::endl; }
};
class Derived : public Base
{
public:
Derived() { std::cout << "Derived" << std::endl; }
virtual ~Derived() { std::cout << "~Derived" << std::endl; }
};
template<class T> T *Safe_Or_Not (T *object)
{
object->T::~T ();
::new (object) T;
return object;
}
int main(int argc, char *argv[])
{
Base* b = new Derived;
b = Safe_Or_Not(b);
delete b;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQmFzZQp7CnB1YmxpYzoKICAgIEJhc2UoKSB7IHN0ZDo6Y291dCA8PCAiQmFzZSIgPDwgc3RkOjplbmRsOyB9CiAgICB2aXJ0dWFsIH5CYXNlKCkgeyBzdGQ6OmNvdXQgPDwgIn5CYXNlIiA8PCBzdGQ6OmVuZGw7IH0KfTsKCmNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZQp7CnB1YmxpYzoKICAgIERlcml2ZWQoKSB7IHN0ZDo6Y291dCA8PCAiRGVyaXZlZCIgPDwgc3RkOjplbmRsOyB9CiAgICB2aXJ0dWFsIH5EZXJpdmVkKCkgeyBzdGQ6OmNvdXQgPDwgIn5EZXJpdmVkIiA8PCBzdGQ6OmVuZGw7IH0KfTsKCgp0ZW1wbGF0ZTxjbGFzcyBUPiBUICpTYWZlX09yX05vdCAoVCAqb2JqZWN0KQp7CiAgICBvYmplY3QtPlQ6On5UICgpOwogICAgOjpuZXcgKG9iamVjdCkgVDsKICAgIHJldHVybiBvYmplY3Q7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIEJhc2UqIGIgPSBuZXcgRGVyaXZlZDsKCiAgICBiID0gU2FmZV9Pcl9Ob3QoYik7CiAgICBkZWxldGUgYjsKICAgIHJldHVybiAwOwp9