智能指针auto_ptr源码

简介

C++没有内存自动回收机制,对堆内存的管理就是简单的new和delete,每次new出来的内存都需要手动delete释放。但由于忘记、流程复杂或者异常退出等,都有可能导致没有执行delete释放内存,造成内存泄漏。

在实际工程中,我们往往希望将精力放在应用层上而不是费劲心思处理语言的细枝末节(内存释放),于是就有了最原始的只能指针auto_ptr。

智能指针原理

将所申请的内存空间交由一个对象去管理,预防程序中出现异常或者由于自己忘记释放所申请的空间,造成内存泄漏的问题。并通过对*和->的重载,使其对象具有指针的特性。

auto_ptr源码

下面是侯捷《STL源码剖析》使用的sgi-stl-v2.91版的auto_ptr源码实现,这个版本的可读性非常好,可惜该版本还没有出现shared_ptr和unique_ptr指针,而新版的源码这部分的实现可读性不太友好。所以这里只能呈现auto_ptr的源码,有助于理解只能指针的原理。

template<class X> 
class auto_ptr {
private:
    X* ptr;
    mutable bool owns;
public:
    typedef X element_type;
    explicit auto_ptr(X* p = 0) __STL_NOTHROW : ptr(p), owns(p) {}
    auto_ptr(const auto_ptr& a) __STL_NOTHROW : ptr(a.ptr), owns(a.owns) {
        a.owns = 0;
    }
    template<class T> auto_ptr(const auto_ptr<T>& a) __STL_NOTHROW 
        : ptr(a.ptr), owns(a.owns) {
        a.owns = 0;
    }

    auto_ptr& operator=(const auto_ptr& a) __STL_NOTHROW {
        if (&a != this) {
            if (owns) 
                delete ptr;
            owns = a.owns;
            ptr = a.ptr;
            a.owns = 0;
        }
    }
    template<class T> auto_ptr& operator=(const auto_ptr<T>& a) __STL_NOTHROW {
        if (&a &= this) {
            if (owns)
                delete ptr;
            owns = a.owns;
            ptr = a.ptr;
            a.owns = 0;
        }
    }
    ~auto_ptr() {
        if (owns)
            delete ptr;
    }

    X& operator*() const __STL_NOTHROW { return *ptr; }
    X* operator->() const __STL_NOTHROW { return ptr; }
    X* get() const __STL_NOTHROW { return ptr; }
    X* release() const __STL_NOTHROW { owns = false; return ptr; }
};
知识兔
计算机