C++智能指针

智能指针其实本质是一个模板类,一般使用是用的这个类的对象,而不是指针
智能指针体现在内存释放问题,用智能指针管理new的对象,不需要手动delete

1、唯一指针std::unique_ptr<T>

独占资源所有权的指针。
(1)使用 std::unique_ptr 自动管理内存

{
    std::unique_ptr<int> uptr = std::make_unique<int>(200);
    //...
    // 离开 uptr 的作用域的时候自动释放内存
}

(2)std::unique_ptr 是 move-only 的

{
    std::unique_ptr<int> uptr = std::make_unique<int>(200);
    std::unique_ptr<int> uptr1 = uptr;  // 编译错误,std::unique_ptr<T> 是 move-only 的

    std::unique_ptr<int> uptr2 = std::move(uptr);
    assert(uptr == nullptr);
}

2、共享指针std::shared_ptr<T>

共享资源所有权的指针。
shared_ptr 需要维护的信息有两部分:
(1)指向共享资源的指针
(2)引用计数等共享资源的控制信息——实现上是维护一个指向控制信息的指针。
简单实现共享指针

template<typename T>
class shared_ptr
{
private:
    T* _ptr;
    int* _count;//共享引用计数,必须使用指针
public:
    //构造函数
    shared_ptr(T* ptr = nullptr) : _ptr(ptr)
    {
        if (_ptr)
        {
            _count = new int(1);
        }
        else
        {
            _count = new int(0);
        }
    }

    //拷贝构造
    shared_ptr(const shared_ptr& ptr)
    {
        if (this != &ptr)
        {
            this->_ptr = ptr._ptr;
            this->_count = ptr._count;
            //引用计数+1
            (*this->_count)++;
        }
    }

    //重载operator=
    shared_ptr& operator=(const shared_ptr& 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;
    }

    //重载operator*
    T& operator*()
    {
        if (this->_ptr)
        {
            return *(this->_ptr);
        }
    }

    //重载operator->
    T* operator->()
    {
        if (this->_ptr)
        {
            return this->_ptr;
        }
    }

    //析构函数
    ~shared_ptr()
    {
        (*this->_count)--;
        if (*this->_count == 0)
        {
            delete this->_ptr;
            delete this->_count;
        }
    }

    //引用计数
    int use_count()
    {
        return *this->_count;
    }
};

3、弱引用指针std::weak_ptr<T>

共享资源的观察者,需要和 std::shared_ptr 一起使用,不影响资源的生命周期。
注意事项:
(1)弱引用指针,不会累计引用计数
(2)weak_ptr只能通过shared_ptr或者weak_ptr来构造
(3)主要应用场景:为了解决shared_ptr循环引用,导致内存无法释放问题
(4)通过成员函数lock获取shared_ptr对象,然后再访问数据
shared_ptr循环引用:

class A
{
public:
    A() {};
    ~A() {};
    std::shared_ptr<B> b;
private:

};

class B
{
public:
    B() {};
    ~B() {};
    std::shared_ptr<A> a;
private:

};

int main()
{
    //循环引用,无法析构
    std::shared_ptr<A> ptr_a = std::make_shared<A>();
    std::shared_ptr<B> ptr_b = std::make_shared<B>();
    ptr_a->b = ptr_b;
    ptr_b->a = ptr_a;
    return 1;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • RAII:C++中一个对象出了其作用域就会被自动析构,只要在构造函数时候申请空间,析构函数时候释放空间,围绕着构造...
    365_9163阅读 697评论 0赞 0
  • C++智能指针 原文链接:http://blog.csdn.net/xiaohu2022/article/deta...
    小白将阅读 7,027评论 2赞 21
  • 智能指针是C++中为了方便动态资源的管理而设置的。 通常情况下,在new了一个资源之后,用完之后,我们需要手动的d...
    黑白配ly阅读 530评论 0赞 1
  • 一、简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记...
    before_9dbe阅读 359评论 0赞 0
  • 四种智能指针 智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在...
    Catherin_gao阅读 444评论 0赞 0

友情链接更多精彩内容