#include <iostream> #include <string> using namespace std; template<class T> class AutoPtr { T *p_; public: AutoPtr(T *p) { cout << "new:" << this << endl; p_ = p; } ~AutoPtr() { cout << "delete:" << this << endl; if (p_) { cout << "!!delete object!!" << endl; delete p_; } } AutoPtr(AutoPtr<T>& other) { cout << "copy:" << this << " <- " << &other << endl; this->p_ = other.p_; other.p_ = 0; } T operator *() { return *(this->p_); } }; AutoPtr<string> create() { string *str = new string("hello, AutoPtr!"); AutoPtr<string> p = AutoPtr<string>(str); cout << *p << "(in create)" << endl; return p; } int main() { cout << "begin" << endl; { AutoPtr<string> str = create(); cout << *str << endl; } cout << "end" << endl; }
begin
new:0013FE24
hello, AutoPtr!(in create)
copy:0013FF54 <- 0013FE24
delete:0013FE24
hello, AutoPtr!
delete:0013FF54
!!delete object!!
end
続行するには何かキーを押してください . . .
はじめは↓の様にしてたら、最適化が働いて、コピーコンストラクタが動かなかった。
AutoPtr<string> create() { string *str = new string("hello, AutoPtr!"); return AutoPtr<string>(str); }