#include #include #include #include using namespace std; class A { public: A() { id = next++; cout << "Actor-" << id << '\n'; } A( const A& o ) { cout << "A copy ctor - " << o.id << '\n'; } ~A() { cout << "dtorA-" << id << '\n'; } A& operator=( const A& rhs ) { cout << "A op= " << rhs.id << '\n'; } string getString() const { stringstream ss; ss << "A-" << id; return ss.str(); } friend ostream& operator<< ( ostream& os, const A& obj ) { return os << "A-" << obj.id; } private: int id; static int next; }; int A::next = 1; void foo( A* arg ) { cout << "fooo: arg is " << arg->getString() << '\n'; } A* bar() { return new A(); } void main( void ) { A* ptr = new A(); cout << "main: ptr is " << ptr->getString() << '\n'; foo( ptr ); delete ptr; ptr = bar(); cout << "main: ptr now is " << ptr->getString() << '\n'; delete ptr; } // Actor-1 // main: ptr is A-1 // fooo: arg is A-1 // dtorA-1 // Actor-2 // main: ptr now is A-2 // dtorA-2 #if 0 void foo( auto_ptr& arg ) { cout << "fooo: arg is " << arg->getString() << '\n'; } auto_ptr bar() { return auto_ptr( new A() ); } void main( void ) { auto_ptr ptr( new A() ); cout << "main: ptr is " << ptr->getString() << '\n'; foo( ptr ); ptr = bar(); cout << "main: ptr now is " << ptr->getString() << '\n'; } // Actor-1 // main: ptr is A-1 // fooo: arg is A-1 // Actor-2 // dtorA-1 // main: ptr now is A-2 // dtorA-2 #endif