简单的 smartpointer

水水地 发第一篇blog, 瘦身版的smartpointer。

template <typename T>
class CountedPtr {
private:
    T* ptr;     
    long* count; // 计数指针
public:

    explicit CountedPtr( T* p = nullptr ) :
        ptr( p ), count( new long( 1 ) ) {}

    CountedPtr( const CountedPtr<T>& p ) throw()  // vs 还不支持 noexcept。。。
        :
        ptr( p.ptr ), count( p.count ) {
        ++*count;   //没copy 一次 计数 +1
    }

    ~CountedPtr() throw() {
        dispose();  // 计数-1 并判断是否为0, 如果为0, 则释放内存
    }
    CountedPtr<T>& operator= ( const CountedPtr<T>& p ) throw() {
        if ( this != &p ) {     // 证同测试
            dispose();          // Scott Meyers 所摒弃的 方法, effective C++ 中
            ptr = p.ptr;        // 是先制作副本, 再swap 。 代码相当精炼
            count = p.count;
            ++*count;
        }
        return *this;
    }

    T& operator*() const throw() {
        return *ptr;
    }
    T* operator->() const throw() {
        return ptr;
    }

private:
    void dispose() {
        if ( --*count == 0 ) {
            delete count;
            delete ptr;
        }
    }
};

 

 

posted @ 2014-06-21 10:55  yeahpeng  阅读(158)  评论(1编辑  收藏  举报