简单的shared_ptr实现

0.前言

C++11为我们带来了std::shared_ptr,方便我们在动态分配内存的时候发生memory leak,他是基于引用计数实现的,下面给出一个简化版本。

1.实现

namespace smart_ptr {
    class counter {
    public:
        counter(unsigned cnt):count_(cnt) {

        }

        unsigned& operator++() {
            ++count_;
            return count_;
        }

        unsigned operator++(int) {
            unsigned count = count_;
            ++count_;
            return count;
        }

        unsigned& operator--() {
            --count_;
            return count_;
        }

        unsigned operator--(int) {
            unsigned count = count_;
            --count_;
            return count;
        }
        unsigned getCount()const {
            return count_;
        }

    private:
        unsigned count_ = 0;
    };

    template<typename T>
    class shared_ptr {
    public:
        using pointer=T *;
        using reference=T &;
        shared_ptr(pointer ptr) {
            counter_ = new counter(1);
            data_ = ptr;
        }
        ~shared_ptr() {
            --(*counter_);
            if (counter_->getCount() == 0) {
                delete data_;
                data_ = nullptr;
                delete counter_;
                counter_ = nullptr;
            }
        }

        shared_ptr(const shared_ptr<T>& s_ptr) {
            counter_ = s_ptr.counter_;
            ++(*counter_);
            data_ = s_ptr.data_;
        }

        pointer get()const {
            return data_;
        }

        unsigned use_count()const {
            return counter_->count_;
        }
        pointer operator->() {
            return data_;
        }

        reference operator*() {
            return *data_;
        }
    private:
        counter* counter_;
        pointer data_;
    };
}

在这里我们声明了一个类counter专门用于计算指向动态内存的对象数量,在我们撞见shared_ptr对象时,动态分配一个内存给成员counter_,当对象发生拷贝时,使用同一个counter增加引用计数。在析构时,我们将counter进行自减,如果自减后counter为零,那么就释放动态分配的内存。也就是说,如果我们想要像new操作符一样手动析构,那么我们只需要手动调用~shared_ptr()即可。手动调用析构函数只是销毁了对象,并没有释放这段内存。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C++中struct和class的区别 ? 在C++中,可以用struct和class定义类,都可以继承。区别在于...
    匿名_22b4阅读 470评论 0 0
  • 导语: C++指针的内存管理相信是大部分C++入门程序员的梦魇,受到Boost的启发,C++11标准推出了智能指针...
    7ee72f98ad17阅读 974评论 0 1
  • C#、Java、python和go等语言中都有垃圾自动回收机制,在对象失去引用的时候自动回收,而且基本上没有指针的...
    StormZhu阅读 3,802评论 1 15
  • 原作者:Babu_Abdulsalam 本文翻译自CodeProject,转载请注明出处。 引入### Ooops...
    卡巴拉的树阅读 30,238评论 13 74
  • C++裸指针的内存问题有:1、空悬指针/野指针2、重复释放3、内存泄漏4、不配对的申请与释放 使用智能指针可以有效...
    WalkeR_ZG阅读 3,174评论 0 5