问题:使用系统默认生成的拷贝构造,赋值运算符的重载会发生崩溃,一个指针delete多次的问题
解决办法:
一个对象给了另外一个对象,将自己释放掉(自己置空),自己释放管理权,保证只释放一次
代码如下:
template<class T>
class AutoPtr
{
public:
AutoPtr(T* ptr)//注意这里为T
:_ptr(ptr)
{}
~AutoPtr()
{
if (_ptr)
{
cout << "delete" << _ptr << endl;
delete _ptr;
_ptr = NULL;
}
}
AutoPtr(AutoPtr<T>& ap)//注意这里为AutoPtr<T>,且不加const
:_ptr(ap._ptr)
{
ap._ptr = NULL;
}
AutoPtr& operator=(AutoPtr<T>& ap)
{
if (this != &ap)
{
delete _ptr;
_ptr = ap._ptr;
ap._ptr = NULL;
}
return *this;
}
public:
T& operator*()
{
return *_ptr;
}
T* operator->()
{
return _ptr;
}
T* GetPtr()
{
return _ptr;
}
protected :
T* _ptr;
};
测试用例:
struct Node
{
int data;
Node* next;
};
void Test1()
{
int* p1 = new int(2);
int *p2 = p1;
int* p3;
p3 = p2;
*p3 = 10;
AutoPtr<int> ap1(new int(1));
AutoPtr<int>ap2 = ap1; // AutoPtr<int>ap2(ap1),都是拷贝构造,但是前者更符合指针的使用习惯;
AutoPtr<int>ap3(new int(3));
ap3 = ap2;
*ap3 = 10;
AutoPtr<Node> apNode(new Node);
apNode->data = 10; //应该为, apNode->ptr->_data,两步合为一步
cout << apNode->data << endl;
cout << endl;
}