zoukankan      html  css  js  c++  java
  • C++智能指针的实现

    转自 C++11中智能指针的原理、使用、实现



    #include <iostream>
    #include <memory>
    template<typename T>
    class SmartPointer {
    private:
        T* _ptr;
        size_t* _count;
    public:
        SmartPointer(T* ptr = nullptr) :
                _ptr(ptr) {
            if (_ptr) {
                _count = new size_t(1);
            } else {
                _count = new size_t(0);
            }
        }
        SmartPointer(const SmartPointer& ptr) {
            if (this != &ptr) {
                this->_ptr = ptr._ptr;
                this->_count = ptr._count;/** 所以实际上是共用了一个_count,是同一个内存  **/
                (*this->_count)++;
            }
        }
        SmartPointer& operator=(const SmartPointer& ptr) {
            if (this->_ptr == ptr._ptr) {
                return *this;
            }
            if (this->_ptr) {
                (*this->_count)--;
                if (this->_count == 0) {
                    delete this->_ptr;
                    delete this->_count;
                }
            }
            this->_ptr = ptr._ptr;
            this->_count = ptr._count;
            (*this->_count)++;
            return *this;
        }
        T& operator*() {
            assert(this->_ptr == nullptr);
            return *(this->_ptr);
        }
        T* operator->() {
            assert(this->_ptr == nullptr);
            return this->_ptr;
        }
        ~SmartPointer() {
            (*this->_count)--;
            if (*this->_count == 0) {
                delete this->_ptr;
                delete this->_count;
            }
        }
        size_t use_count(){
            return *this->_count;
        }
    };
    int main() {
        {
            SmartPointer<int> sp(new int(10));
            SmartPointer<int> sp2(sp);
            SmartPointer<int> sp3(new int(20));
            sp2 = sp3;
            std::cout << sp.use_count() << std::endl;
            std::cout << sp3.use_count() << std::endl;
        }
        //delete operator
    }
  • 相关阅读:
    c# 异步和同步问题(转载)
    用Python作GIS之四:Tkinter基本界面的搭建
    Linux必知必会--vmstat
    Linux必知必会--awk
    Linux必知必会--sed
    Linux必知必会--grep
    Linux必知必会--curl
    康威定律
    移动端抓包合集
    MySQL重置自增id
  • 原文地址:https://www.cnblogs.com/qingergege/p/10486286.html
Copyright © 2011-2022 走看看