1.VC版本-归属权转移不彻底
#include <iostream>
#include <string>
using namespace std;
template<class T>
class auto_ptr
{
public:
auto_ptr(T *p = 0):m_bOwner(p != 0),m_pPtr(p)
{}
auto_ptr(const auto_ptr<T> &obj= 0):m_bOwner(obj.m_bOwner),m_pPtr(obj.release())
{}
auto_ptr<T>& operator=(const auto_ptr<T> &obj)
{
if(this != &obj )
{
m_bOwner = obj.m_bOwner;
m_pPtr = obj.release();
}
return *this;
}
~auto_ptr()
{
if(m_bOwner)
{
delete m_pPtr;
}
}
public:
T& operator*() const { return *m_pPtr; }
T* operator->() const {return m_pPtr;}
T* release() const
{
((auto_ptr<T>*)this)->m_bOwner = false;
return m_pPtr;
}
private:
bool m_bOwner;
T* m_pPtr;
};
class CFun
{
public:
void fun() const
{
cout << "this is test func" << endl;
}
int m_a;
};
int main()
{
int *p = new int(10);
auto_ptr<int> pa(p); // RAII
cout << *pa << endl; // oprator*
CFun *pt = new CFun;
auto_ptr<CFun> pa1(pt);
pa1->fun(); // oprator->
pa1->m_a = 800000; // oprator->
cout << pa1->m_a << endl;
auto_ptr<int> pa2 = pa;
cout << *pa2 << endl;
*pa2 = 100;
cout << *pa2 << endl;
//auto_ptr<int> pa2 = pa1;
//pa2 = pa1;
auto_ptr<int> pa3(pa);
pa3 = pa;
cout << *pa3<< endl;
}