在C++中,非常常用的一种技术就是智能指针,智能指针其实是RAII技术的一种应用,通过构建类类型实例的生命周期来管理指针,控制指针的初始化和资源释放。
具体而言,智能指针都需要重载-> 和 * 操作符,从而可以采用标准的指针语法来使用它们,有时候还有一些指针的运算操作符,+,-,+=,-=,++,--等等
通常智能指针会被实现为一个模板:
1: template <typename T>
2: class CheckedPtr
3: {
4: public:
5: explicit CheckedPtr(T *p):p_(p) {}
6: ~CheckedPtr(){ delete p_;}
7: T* operator*() { return get();}
8: T &operaot&() { return *get();}
9:
10: private:
11: T *p_;
12: T * get()
13: {
14: if(!p_)
15: throw NullCheckedPointer();
16: return p_;
17: }
18:
19: CheckedPtr( const CheckedPtr &);
20: CheckedPtr & operator = ( const CheckPtr &);
21:
22: // 私有复制和赋值操作符,是禁止赋值和复制;
23: }
他的使用与常用的方式一样;
1: CheckedPtr<classname> pClass1( new classname);
2: CheckedPtr<classname> pClass2 = new classname;
3: (*pClass1).func1();
4: *pClass1 = classinstance;
要注意,我们在使用RAII中使用的是delete ,所以智能指针不能指向一个数组类型的变量,因为他的析构要采用delete[]