异常安全的auto_ptr类的简单实现

通过定义一个类来封闭资源的分配和释放,可以保证正确释放资源。这一技术常称为"资源分配即初始化",简称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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值