通过定义一个类来封闭资源的分配和释放,可以保证正确释放资源。这一技术常称为"资源分配即初始化",简称RAII.
auto_ptr类就是异常安全的“资源分配即初始化”技术的例子。更详细的介绍请点击这里。
下面是auto_ptr类的简单的实现。
#include <iostream>
//#include <memory>
using namespace std;
template <typename T>
class Auto_ptr {
public:
//不进行隐式转换
explicit Auto_ptr(T* p = 0):pointer(p) {}
template <typename U>
Auto_ptr(Auto_ptr<U>& p):pointer(p.release()) {}
T* release() {
T* tmp = pointer;
pointer = 0;
return tmp;
}
T* get();
void reset(T* p);
//重载成员访问操作符
T* operator->();
T& operator*();
template <typename U>
Auto_ptr<T>& operator=(Auto_ptr<U>& p);
~Auto_ptr() {delete pointer;}
private:
T* pointer;
};
template <typename T>
T* Auto_ptr<T>::get() {
return pointer;
}
template <typename T>
void Auto_ptr<T>::reset(T* p) {
if(pointer != p)
pointer = p;
}
template <typename T>
T* Auto_ptr<T>::operator->() {
return pointer;
}
template <typename T>
T& Auto_ptr<T>::operator*() {
return *pointer;
}
template <typename T> template <typename U>
Auto_ptr<T>& Auto_ptr<T>::operator=(Auto_ptr<U>& p) {
if(this != &p) reset(p.release());
return *this;
}
class Base{};
class Derive:public Base{};
int main() {
Auto_ptr<int> ap(new int(10));
cout << *ap << endl;
Auto_ptr<int> ap1;
ap1 = ap;
cout << *ap1 << endl;
ap1.reset(new int(50));
cout << *ap1 << endl;
Auto_ptr<Derive> ap2(new Derive());
Auto_ptr<Base> ap3(ap2);
return 0;
}