智能指针存在的问题
通过对指针的封装,让类可以像指针一样。这样的智能指针还是存在些问题。之前我们解决了,对象拷贝问题,引入引用技术保存拷贝次数,当拷贝次数为1时,便可以直接释放析构对象。现在存在的新的问题是,之前都是用来管理单个对象,那么如果想管理一个数组呢?因此出现了下面的问题:
class AA
{
public:
~AA()
{
}
void Dispaly()
{
cout << _a << endl;
}
private:
int _a;
};
template <class T>
class SharePtr
{
public:
SharePtr( T* ptr)
:_ptr(ptr)
, _pCount(new int(1))
{}
~SharePtr()
{
if (--(*_pCount) == 0)
{
delete _pCount;
delete _ptr;
}
}
SharePtr(SharePtr<T>& s)
:_ptr(s._ptr)
, _pCount(s._pCount)
{
++*_pCount;
}
SharePtr<T>& operator=(SharePtr<T>& s)
{
if (this != &s)
{
if ( --(*_pCount) == 0 )
{
delete _ptr;
delete _pCount;
}
_ptr = s._ptr;
_pCount = s._pCount;
++(*_pCount);
}
return *this;
}
T& operator*()
{
return *_ptr;
}
T* operator->()
{
return _ptr;
}
private:
int *_pCount;
T *_ptr;
};
void Test()
{
SharePtr<AA> p1 = new AA[10];//断点处
}
很明显,代码崩溃了。缘何?
把断点打到 SharePtr p1 = new AA[10];//断点处进去之后可以看到
由于对象析构时,delete删除的位置不正确,delete从第二个字节开始删除,因而崩溃了。
因此出现了shareArray,只要把delete 改为 delete[ ],则可以。