shared_ptr实现

参考文献:

http://blog.leanote.com/post/shijiaxin.cn@gmail.com/C-shared_ptr

https://www.cnblogs.com/wxquare/p/4759020.html

#include <iostream>
#include <memory>
using namespace std;

class Delete
{
public:
    template <typename T>
    void operator()(T *p) const
    {
        delete p;
    }
};

template<typename T>
class my_shared_ptr {
public:
    T* _ptr;
    size_t* _count;
    size_t* _weak_count;
    void clear() {
        if(this->_ptr != nullptr) {
            (*this->_count)--;
            if (*this->_count == 0) {
                delete this->_ptr;
                delete this->_count;
                this->_ptr = nullptr;
                this->_count = nullptr;
            }
        }
    }
public:
    my_shared_ptr(T* ptr = nullptr) :
            _ptr(ptr) {
        if (_ptr) {
            _count = new size_t(1);
            _weak_count = new size_t(0);
        } else {
            _count = new size_t(0);
            _weak_count = new size_t(0);
        }
    }
    my_shared_ptr(const my_shared_ptr& ptr) {
        if (this != &ptr) {
            this->_ptr = ptr._ptr;
            this->_count = ptr._count;
            (*this->_count)++;
        }
    }
    my_shared_ptr& operator=(const my_shared_ptr& ptr) {
        if (this->_ptr == ptr._ptr) {
            return *this;
        }
        clear();
        this->_ptr = ptr._ptr;
        this->_count = ptr._count;
        (*this->_count)++;
        return *this;
    }
    T& operator*() {
        return *(this->_ptr);

    }
    T* operator->() {
        return this->_ptr;
    }
    ~my_shared_ptr() {
        clear();
    }
    size_t use_count(){
        return *this->_count;
    }
};
template <typename T>
class my_weak_ptr {
    void clear() {
        if (_ptr == nullptr)
            return;
        _weak_count--;
        if (_count == 0 && _weak_count == 0) {
            delete _ptr;
            delete _count;
            delete _weak_count;
        }
        _count = nullptr;
        _weak_count = nullptr;
        _ptr = nullptr;
    }
public:
    my_weak_ptr() {
        _count = nullptr;
        _ptr = nullptr;
        _weak_count = nullptr;
    }
    my_weak_ptr(const my_shared_ptr<T> &ptr) {
        _count = ptr._count;
        _ptr = ptr._ptr;
        _weak_count = ptr._weak_count;
        if (ptr._ptr == nullptr)
            return;
        _weak_count++;
    }
    my_weak_ptr<T> &operator=(const my_shared_ptr<T> &ptr) {
        clear();
        if (ptr._ptr == nullptr)
            return *this;
        _count = ptr._count;
        _weak_count = ptr._weak_count;
        _ptr = ptr._ptr;
        _weak_count++;
        return *this;
    }

    size_t* _count;
    size_t* _weak_count;
    T* _ptr;

    my_shared_ptr<T> lock() {
        my_shared_ptr<T> tmp;
        if (_count == nullptr || _count == 0)
        {
            return tmp;
        }
        tmp._count = _count;
        tmp._ptr = _ptr;
        tmp._weak_count = _weak_count;
        _weak_count++;
        return tmp;
    }
};
class myClass {
public:
    my_weak_ptr<myClass> parent;
    my_shared_ptr<myClass> child;
    string name;
    myClass(string name) : name(name) { cout << "Create " << name << endl; };
    ~myClass() { cout << "Delete " << name << endl; }
};
int main()
{
    my_shared_ptr<myClass> p1(new myClass("a"));
    my_shared_ptr<myClass> p2(new myClass("bb"));
    my_shared_ptr<myClass> p3 = p1;
    cout<<p1.use_count()<<endl;
    p1->child = p2;
    p2->parent = p1;
    auto ptr = p2->parent.lock();
    cout << ptr->name << endl;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务