对于智能指针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;

}