一篇文章带你搞定手写shared_ptr智能指针

面试过程中可能经常会遇到手写智能指针的问题,这个问题对同学们的基础要求比较扎实,自我感觉来说比写一些算法题更有意义。

引用计数

首先提到智能指针shared_ptr,那么大家会想到引用计数,我们可以使用一个类,单独完成引用计数这一功能。
共享指针shared_ptr,多个智能指针同时拥有一个对象,当他们全部失效时,这个对象也同时会被删除。
图片说明
这个shared_count类除构造函数外有三个方法:一个增加计数,一个减少计数,一个获得计数。
增加计数的时候不需要返回计数值,但减少的时候必须返回计数值,因为需要判断是否是最后一个计数。

重载运算符

指针常见的一些运算符的操作需要进行重载:

  • *运算符解引用
  • ->运算符指向对象成员
  • 像指针一样用在布尔表达式里

所以增加几个成员函数就能解决:

shared_ptr实现

class Type
{
public:
    int a = 1;
};

class share_count {
public:
    share_count() : _count(1) {}
    void add_count() {
        ++_count;
    }
    long reduce_count() {
        return --_count;
    }
    long get_count() const {
        return _count;
    }
private:
    long _count;
};

template<typename T>
class smart_ptr
{
public:
    smart_ptr(T* ptr = NULL) : m_ptr(ptr) {
        if (ptr) {
            m_share_count = new share_count;
        }
    }
    ~smart_ptr() {
        if (m_ptr && !m_share_count->reduce_count()) {
            delete m_ptr;
            delete m_share_count;
            cout << "~smart_ptr" << endl;
        }
    }
    T& operator*() const { return *m_ptr; }
    T* operator->() const { return m_ptr; }
    operator bool() const { return m_ptr; }

    smart_ptr(const smart_ptr& rhs) noexcept {
        m_ptr = rhs.m_ptr;
        m_share_count = rhs.m_share_count;
        m_share_count->add_count();
    }
    smart_ptr& operator=(const smart_ptr& rhs) noexcept {
        m_ptr = rhs.m_ptr;
        m_share_count = rhs.m_share_count;
        m_share_count->add_count();
        return *this;
    }
    long use_count() const {
        if (m_ptr) {
            return m_share_count->get_count();
        }
        return 0;
    }
private:
    T* m_ptr;
    share_count* m_share_count;
};
#面经笔经#
全部评论
重载=时,等号左边的智能指针管理的对象的引用计数需要减一吧
3 回复 分享
发布于 2022-06-15 10:31
不仅是重载赋值操作符,在定义拷贝构造函数的时候也需要m_share_count.reduce(),如果为0则调用析构函数。这个点忘记了吧
1 回复 分享
发布于 2022-06-16 21:57
楼主写的非常好,就是稍微有点瑕疵,operator=判断一下传进来是不是等于当前对象,是的话要直接返回,这里写的如果不判断的话,引用计数传自己也能一直加,最后也会发生内存泄露。
点赞 回复 分享
发布于 2022-07-29 07:02

相关推荐

评论
10
64
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务