前面,已经对 智能指针AutoPtr 简单的剖析和学习了。
现在,记录 对 ScopedPtr 的学习和个人的一些理解。
ScopedPtr (管理单个对象)
对ScopedPtr的理解:
由于智能指针容易出现拷贝时释放两次的情况,所以ScopedPtr主要是防止拷贝
防止拷贝必须满足的两个条件:
1、设置保护限定符
2、对拷贝构造函数和赋值运算符执行声明不定义
如果只满足第二个条件,没有设置保护限定符,若在类外进行定义后,则会出现问题,所以说这两个条件是必不可少的。这样就能够避免上面所出现的问题,但是这样就造成了它在功能上的缺陷。
按照前面的学习和对ScopedPtr的作用+满足的条件 写出它的大致基本雏形
template < typename T >
class ScopedPtr //主要用来防止拷贝
{
public :
ScopedPtr( T * ptr )
:_ptr( ptr )
{}
~ScopedPtr()
{
if (NULL != this)
{
delete _ptr;
_ptr = NULL ;
}
}
protected :
ScopedPtr< T >(ScopedPtr < T>& ap); //拷贝构造
ScopedPtr <T > opreator = ( ScopedPtr & ap); //赋值运算符重载
private :
T * _ptr;
};
#include<iostream>
using namespace std;
int main()
{
int* p = new int(1);
ScopedPtr<int> sp (p);
//ScopedPtr<int> sp1(sp); 访问不了
return 0;
}
建议:在网上上也看到不少对于智能指针面试题的题目,不妨写一个ScopedPtr,这样很容易写出来的(比AutoPtr简单),而且不容易出错。
ScopedPtrArray(管理数组)
template<typename T>
class ScopedPtrArray
{
public:
ScopedPtrArray(T* ptrArr = NULL)
:_ptrArr(ptrArr)
{}
~ScopedPtrArray()
{
if (NULL != this)
{
delete[] _ptrArr; //使用delete[]
_ptrArr = NULL;
}
}
protected:
ScopedPtrArray<T>(ScopedPtrArray<T> & parr);
ScopedPtrArray& operator=(ScopedPtrArray<T> & parr);
private:
T* _ptrArr;
};
测试:
#include<iostream>
using namespace std;
int main()
{
ScopedPtrArray<int> pa(new int[10]);
//ScopedPtrArray<int> pa1(pa); //拷贝构造为protected
return 0;
}