对于智能指针AutoPtr,一般有两种实现的方法,一种是s1与s2同时指向一个空间的时候,将s1置为空,这样就会避免析构的时候产生麻烦。
#include <iostream>
#include <string>
using namespace std;
template <class T>
class AutoPtr
{
protected:
T *_ptr;
public:
AutoPtr(T * ptr)
:_ptr(ptr)
{}
~AutoPtr()
{
if (_ptr)
{
cout << "delete" << endl;
delete _ptr;
}
}
AutoPtr(AutoPtr<T>& ap)
:_ptr(ap._ptr)
{
ap._ptr = NULL;
}
AutoPtr<T>operator=(AutoPtr <T> &ap)
{
if (this != &ap)
{
delete _ptr;
_ptr = ap._ptr;
ap._ptr = NULL;
}
return *this;
}
T &operator*()
{
return *_ptr;
}
T *operator->()
{
return _ptr;
}
};
第二种方法是s1与s2同时指向一个空间的时候,设立一个标志量_owner,将s1的_owner置为false,这样当析构的时候当_owner为true的时候再析构。
#include <iostream>
#include <string>
using namespace std;
template <class T>
class AutoPtr
{
private:
T *_ptr;
bool _owner;
public:
AutoPtr(T *ptr=new T(1))
:_ptr(ptr)
, _owner(true)
{
cout << "AutoPtr()" << endl;
}
~AutoPtr()
{
if (_ptr != NULL)
{
if (_owner == true)
{
delete _ptr;
cout << "~AutoPtr()" << endl;
}
}
}
AutoPtr(AutoPtr<T> &ap)
{
_ptr = ap._ptr;
_owner = true;
ap._owner = false;
}
AutoPtr<T>&operator=(AutoPtr<T> &ap)
{
if (this != &ap)
{
delete _ptr;
_ptr = sp._ptr;
_owner = true;
sp._owner = false;
}
}
};
void test()
{
AutoPtr<int> s1;
AutoPtr<int>s2(s1);
}
int main()
{
test();
getchar();
return 0;
}