首页 > 其他分享 >智能指针

智能指针

时间:2022-09-29 22:44:58浏览次数:54  
标签:return 智能 pcount operator shared unique ptr 指针

RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内 存、文件句柄、网络连接、互斥量等等)的简单技术。 在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在 对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。

这种做 法有两大好处:

  • 不需要显式地释放资源。
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。

 

先实现一个普通的智能指针

template<class T>
class smart_ptr
{
public:
    smart_ptr(T* ptr)
        :_ptr(ptr)
    {}

    ~smart_ptr()
    {
        if (_ptr)
        {
            delete _ptr;
            _ptr = nullptr;
        }
    }

    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }

private:
    T* _ptr;
};

即使中间有异常抛出,当作用域走完生命周期,析构函数会自动调用。完成析构,就不会发生了内存泄漏问题。

 

unique_ptr 基本实现

template<class T>
class unique_ptr
{
public:
    unique_ptr(T* ptr)
        :_ptr(ptr)
    {}

    ~unique_ptr()
    {
        if (_ptr)
        {
            delete _ptr;
            _ptr = nullptr;
        }
    }

    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }

    unique_ptr(unique_ptr<T>& p) = delete;
    unique_ptr<T> operator=(unique_ptr<T>& p) = delete;

private:
    T* _ptr;
};

unique_ptr跟普通智能指针区别不大  只是unique_ptr是不允许用拷贝和赋值的

 

shared_ptr基本实现

它能使用拷贝和赋值  使用的是一种计数的方法。

    template<class T>
    class shared_ptr
    {
    public:
        shared_ptr(T* ptr)
            :_ptr(ptr)
            , pcount(new int(1))
        {}

        ~shared_ptr()
        {
            Relses();
        }

        T& operator*()
        {
            return *_ptr;
        }

        T* operator->()
        {
            return _ptr;
        }

        shared_ptr(shared_ptr<T>& p)
            :_ptr(p._ptr)
            ,pcount(p.pcount)
        {
            (*pcount)++;
        }

        void Relses()
        {
            if (--(*pcount) == 0 && _ptr)
            {
                cout << _ptr << endl;
                delete _ptr;
                delete pcount;
                _ptr = nullptr;
                pcount = nullptr;
            }
        }

        shared_ptr<T>& operator=(shared_ptr<T>& p)
        {
            if (_ptr != p._ptr)//当两个指针地址不相同才赋值
            {
                Relses();

                _ptr = p._ptr;
                pcount = p.pcount;
                *(pcount)++;
            }
            return *this;
        }

    private:
        T* _ptr;
        int* pcount;
    };

 

标签:return,智能,pcount,operator,shared,unique,ptr,指针
From: https://www.cnblogs.com/LonelyMoNan/p/16743363.html

相关文章

  • C++指针入门
    C++指针入门目录C++指针入门C++中变量位置C++中指针的声明利用指针实现swap()C++中变量位置#include<iostream>usingnamespacestd;intmain(){intvar1;......
  • C#交换方法指针
    被引用的dll是testDllFr.dll,其代码为:namespacetestDLLFr{publicclassTestA{publicstaticvoidTestAM(){Console.Write......
  • python人工智能项目实战,PDF+源码
    机器学习AI算法工程 公众号:datayx《python人工智能项目IntelligentProjectsUsingPython》实施机器学习和深度学习方法,使用Python构建智能,认知AI项目主要特点帮助您掌......
  • 企业如何通过智能产品实现人力资源数字化转型
        在如今数字化时代,如果企业人力资源管理的内外部环境发生改变,战略目标将会随着市场环境产生变化,组织架构越来越扁平化、人员流动性也会增高。传统的企业人力资源......
  • 智能工厂的ERP和MES之间的区别?
    无论在哪里,ERP(EnterpriseResourcePlanning,企业资源计划)和MES(ManufacturingExecutionSystem,即制造执行系统)系统都不是同样的东西,也不应该拿来谈区别的,在智能工厂......
  • 为什么 MES 管理系统是智能制造的核心?
    不能说MES管理系统是智能制造的核心,只能说MES管理系统是智能制造的核心的一部分,并且是一小部分。智能制造的核心的为高端制造装备和工业互联网平台,引用工信部赛迪研究院......
  • 数智化下,如何构建万物互联的智能世界?
    数智化其实就是数字化的另一种提法而已,本身数字化已经包含了智能化,如果没有智能化,纯粹数字化也没有意义,所以在提“数字化”时本身就已经包含了智能化的部分,数字化的更专业......
  • C++11:智能指针
    C++11中有unique_ptr、shared_ptr与weak_ptr等智能指针(smartpointer),定义在memory中。可以对动态资源进行管理,保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终......
  • 打造一站式智能运维系统,「华汇数据」为政企降低运维成本
    在新基建、数字化、智能化的建设浪潮下,随着大数据、人工智能、云计算等新兴技术的深入应用,IT运维管理成为时下IT界的热门话题之一。IT运维市场需求爆发,但当前只有极少数企业......
  • Go基础编程:复合类型—指针
    指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。Go语言对指针的支持介于Java语言和C/C++语言之间,它既没有想Java语言那样......