水水地 发第一篇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; } } };