C++程序员一定很熟悉CAutoPtr,至少它是我接触到的第一个智能指针,而且这个指针转移控制权,这是它非常大一个特色,ATL里也有这个,和STL里是一个东西,只不过这个没有支持异常(没有编译进去)。CAutoVectorPtr是只能数组指针,特别地,它没有构造函数,所以使用起来要分为声明和分配两步。
CAutoPtr
pap(new SomeClass);
pap->doSomeThing();
//##CAutoPtr
//A.CAutoPtr构造函数和析够函数,CAutoPtr一共有4个构造函数
//1.构造默认NUL指针函数
CAutoPtr
pap1;
//2.拷贝构造
CAutoPtr
pap2(pap1); //所有权转移给pap2.
//3.兼容构造,就是用一个可转型的类型指针进行构造,一般来说,这种转型必须是继承链上的类型向上转型
CAutoPtr
temppap;
CAutoPtr
pap3(temppap);
//4.直接由裸指针进行构造,这里有个常用的小技巧就是传递new XXX(),其实就是传递了裸指针,不要在读代码的时候觉得晦涩
CAutoPtr
pap4(new SomeClass());
//5.CAutoPtr的析够函数简单进行了delete指针并赋NUL的操作,即使多次调用,也没问题的,因为C++里,delete NULL没问题
pap4.Free(); //其实是多余调用,除非你特别想删除现在的指针,析够函数里它还会被调用
//B.CAutoPtr的赋值操作
//1.可转换类型间的赋值操作
pap3 = temppap; //一定要记住,CAutoPtr的赋值转移所有权,另外赋值操作也会清理原有指针,另另外,赋值操作也进行了自身检测
//2.同类型的转换
pap1 = pap2; //一定要记住,转移所有权丷丷
//C.CAutoPtr定义了转换操作符,因而可以像使用常规指针的样式一样使用CAutoPtr
pap->doSomeThing();
//D.比较操作
//指针直接可以比较以确定是否同一指针,CAutoPtr定义了==和!=
if (pap1 == pap2)
{
}
if (pap1 != pap2)
{
}
//##CAutoVectorPtr
//1.CAutoVectorPtr多数时候和CAutoPtr的操作一样,但是,CAutoVectorPtr没有构造函数,CAutoVectorPtr定义了一个Allocate方法
CAutoVectorPtr
avp1; //只是定义了CAutoVectorPtr
avp1.Allocate(100); //在这里才实际分配空间
//2.CAutoVectorPtr未定义operator->,因此只能使用原生操作
((int*)avp1)[5] = 5;
//3.一个限制:CAutoVectorPtr的Allocate方法必须使用类的默认构造函数构造vector,如果没有无参数的默认构造函数,那不能使用CAutoVectorPtr
//4.CAutoVectorPtr也是自管理资源的,如果你非调用Free,那也没什么问题,毕竟你可能想释放内存
avp1.Free(); //你可以这样使用,但是没有必要,除非你特别想释放内存