#include <iostream>
using namespace std;
class Tracer {
static int nextid;
int id;
public :
Tracer ( ) : id( ++ nextid) {
cout << "Tracer " << id<< " created" << endl;
}
~Tracer( ) {
cout << "Tracer " << id<< " destroyed" << endl;
}
} ;
int Tracer:: nextid = 0 ;
int main( )
{
{
struct Simple { Tracer i; } s;
s.i .~Tracer( ) ; // not needed if integer.
new ( & s.i ) Tracer; // the lifecyle of the newly created object
// will auto, since Simple will be destroyed when
// going out of scope
}
cout << "Simple went out of scope" << endl;
{
struct Complex { char s[ 256 ] ; } c;
Tracer * p = new ( & c.s ) Tracer; // the lifecycle of the newly created object
// is dynamic. You'll need to delete it in time.
// because compiler doesn't know about its true nature
// and memory will be lost when going out of scope
p- > ~Tracer( ) ;
}
cout << "Complex went out of scope" << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgVHJhY2VyIHsKCXN0YXRpYyBpbnQgbmV4dGlkOwoJaW50IGlkOyAKcHVibGljOiAgCiAgICBUcmFjZXIgKCkgOiBpZCgrK25leHRpZCkgewogICAgICAgIGNvdXQ8PCJUcmFjZXIgIjw8aWQ8PCIgY3JlYXRlZCI8PGVuZGw7ICAgICAJCiAgICB9CiAgICB+VHJhY2VyKCkgewogICAgICAgICBjb3V0PDwiVHJhY2VyICI8PGlkPDwiIGRlc3Ryb3llZCI8PGVuZGw7ICAgICAJCiAgICB9Cn07CmludCBUcmFjZXI6Om5leHRpZCA9MDsgCgppbnQgbWFpbigpCnsKCXsKICAgIAlzdHJ1Y3QgU2ltcGxlIHsgVHJhY2VyIGk7IH0gczsKICAgIAlzLmkuflRyYWNlcigpOyAgICAgICAgICAgLy8gbm90IG5lZWRlZCBpZiBpbnRlZ2VyLiAKICAgIAluZXcgKCZzLmkpIFRyYWNlcjsgICAgICAgLy8gdGhlIGxpZmVjeWxlIG9mIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdCAKICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBhdXRvLCBzaW5jZSBTaW1wbGUgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbgogICAgICAgICAgICAJICAgICAgICAgICAgICAgICAvLyBnb2luZyBvdXQgb2Ygc2NvcGUKCX0KCWNvdXQgPDwgIlNpbXBsZSB3ZW50IG91dCBvZiBzY29wZSI8PGVuZGw7CgkKCXsKICAgIAlzdHJ1Y3QgQ29tcGxleCB7IGNoYXIgc1syNTZdOyB9IGM7IAogICAgCVRyYWNlciAqcCA9IG5ldyAoJmMucykgVHJhY2VyOyAgLy8gdGhlIGxpZmVjeWNsZSBvZiB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBkeW5hbWljLiAgWW91J2xsIG5lZWQgdG8gZGVsZXRlIGl0IGluIHRpbWUuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBjb21waWxlciBkb2Vzbid0IGtub3cgYWJvdXQgaXRzIHRydWUgbmF0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbWVtb3J5IHdpbGwgYmUgbG9zdCB3aGVuIGdvaW5nIG91dCBvZiBzY29wZQogICAgICAgIHAtPn5UcmFjZXIoKTsgCiAgICB9Cgljb3V0IDw8ICJDb21wbGV4IHdlbnQgb3V0IG9mIHNjb3BlIjw8ZW5kbDsKfQ==