C++新特性

目录

一、智能指针

       1.shared_ptr



一、智能指针

1.shared_ptr

shared_ptr 是一种共享式智能指针,可以被多个 shared_ptr 对象共享同一个对象,当最后一个 shared_ptr 对象销毁时,它所管理的对象也会被销毁。

shared_ptr 使用引用计数来管理对象的生命周期;

当两个或多个对象使用shared_ptr相互持有对方的指针时,每个对象的引用计数都至少为1。即使在没有外部引用的情况下,这些对象的引用计数也不会降为0,因为它们彼此之间保持着引用。由于引用计数无法降为0,这些对象的析构函数永远不会被调用,导致资源泄漏。

为了解决循环引用的问题,可以使用weak_ptr来取代shared_ptr。weak_ptr允许对象之间存在引用,但不会增加引用计数,也不会阻止对象的销毁。

/** shared_ptr **/
/*  三个成员变量: 指针 引用计数 锁(计数前后需要加锁解锁) */
/*  构造函数 拷贝构造函数 参数列表 */
/*  析构函数: Release() 具体实现 */
/*  运算符重载: = * ->  (需要注意函数的type 和 返回类型 对应) */
/*  实现一个返回引用计数的大小的函数 */

template<class T>
class shared_ptr 
{
private:
    T* ptr;
    int* ptrcount;
    std::mutex* mt;
public:
    // 构造函数
    shared_ptr(T* _ptr):ptr(_ptr){
        ptrcount = new int(1);  // 引用计数
        mt = new mutex;         // 锁
    }
    void Addcount(){
        mt->lock();
        (*ptrcount)++;  // 计数++
        mt->unlock();
    }
    // 拷贝构造函数 参数列表
    shared_ptr(shared_ptr<T>& sp):ptr(sp.ptr), ptrcount(sp.ptrcount), mt(sp.mt)
    {
        Addcount();
    }

    // operator关键字 操作符重载
    shared_ptr<T>& operator=(const shared_ptr<T>& sp){
        if(sp.ptr != ptr){ // 新指针和旧指针不一样
            Release();     // 释放旧资源
            ptr = sp.ptr;  // 将新的给旧的
            ptrcount = sp.ptrcount;
            mt = sp.mt;
            Addcount();
        }
        return *this;  // 新指针和旧指针一样,则直接返回原来的
    }

    ~shared_ptr(){  // 析构函数
        Release();
    }

    int& use_count(){  // 返回引用计数的大小
        return *ptrcount;
    }

    void Release()
    {
        bool deleteflag{false};
        mt->lock(); //加锁
        if(--(*ptrcount) == 0) // 两步:减少引用计数,如果为0则释放内存
        {
            delete ptrcount;  // 删除指针
            delete ptr;
            ptrcount = nullptr; // 赋值为空指针,防止野指针
            ptr = nullptr;
            deleteflag = true;
        }
        mt->unlock(); //解锁

        if(deleteflag == true){
            delete mt;
            mt = nullptr;
        }
    }

    T& operator *(){  // 重载*运算符
        return *ptr;
    }

    T* operator ->(){  // 重载->运算符
        return ptr;
    }
};


【c++复习笔记】——智能指针详细解析(智能指针的使用,原理分析)-CSDN博客
shared_ptr循环引用问题_c++ shared_ptr互相引用解决方案-CSDN博客

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值