• 智能指针


    1智能指针

    智能指针主要是为了延迟创建对象,而不需要在构造函数中创建。

    本文只是将网上优秀博主的代码转载过来

    原文链接https://blog.csdn.net/zk3326312/article/details/79108690

    原文链接https://blog.csdn.net/CPriLuke/article/details/79462791

    1.1shared_from_this()

    c++11中的shared_from_this()来源于boost中的enable_shared_form_this类和shared_from_this()函数,功能为返回一个当前类的std::share_ptr,使用方法如下:

        #include<memory>
    
        class Test: public std::enable_shared_from_this<Test>
        {
         public:  
            Test();
            ~Test();
            std::shared_ptr<Test> getSharedFromThis()
            {
                return shared_from_this();
            }
        }
    

    在什么情况下要使类A继承enablesharefrom_this?

    • 使用场合

    当类A被share_ptr管理,且在类A的成员函数里需要把当前类对象作为参数传给其他类的函数时,就需要传递一个指向自身的share_ptr。

    我们就使类A继承enablesharefromthis,然后通过其成员函数sharefromthis()返回当指向自身的shareptr。

    • 疑惑

    1.把当前类对象作为参数传给其他函数时,为什么要传递share_ptr呢?直接传递this指针不可以吗?

    一个裸指针传递给调用者,谁也不知道调用者会干什么?假如调用者delete了该对象,而share_tr此时还指向该对象。

    2.这样传递shareptr可以吗?shareptr

    这样会造成2个非共享的share_ptr指向一个对象,最后造成2次析构该对象。

    1.2make_shared()

    make_shared函数的主要功能是在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr;由于是通过shared_ptr管理内存,因此一种安全分配和使用动态内存的方法。

    如下为make_shared的使用

        //p1指向一个值为"9999999999"的string
        shared_ptr<string> p1 = make_shared<string>(10, '9');    
        shared_ptr<string> p2 = make_shared<string>("hello");  
        shared_ptr<string> p3 = make_shared<string>(); 
    
    • 要点

    1)make_shared是一个模板函数;

    2)make_shared模板的使用需要以“显示模板实参”的方式使用,如上题所示make_shared(10, 9),如果不传递显示 模板实参string类型,make_shared无法从(10, '9')两个模板参数中推断出其创建对象类型。

    3)make_shared在传递参数格式是可变的,参数传递为生成类型的构造函数参数,因此在创建shared_ptr对象的过程中调用了类型T的某一个构造函数。

    1.2.1make_shared模板实现

    如下为make_shared的库函数实现版本:

        template<typename _Tp, typename... _Args>
        inline shared_ptr<_Tp>
        make_shared(_Args&&... __args)
        {
          typedef typename std::remove_const<_Tp>::type _Tp_nc;
          return std::allocate_shared<_Tp>(std::allocator<_Tp_nc>(),
                           std::forward<_Args>(__args)...);
        }
    
        template<typename _Tp, typename _Alloc, typename... _Args>
        inline shared_ptr<_Tp>
        allocate_shared(const _Alloc& __a, _Args&&... __args)
        {
          return shared_ptr<_Tp>(_Sp_make_shared_tag(), __a,
                     std::forward<_Args>(__args)...);
        }
  • 相关阅读:
    ubuntu安装openssh-server 报依赖错误的解决过程
    用 Scikit-Learn 和 Pandas 学习线性回归
    python 10分钟入门pandas
    (转)梯度下降法及其Python实现
    pandas处理日期时间,按照时间筛选
    谁动了我的特征?——sklearn特征转换行为全记录
    使用sklearn做单机特征工程
    罗技鼠标黑科技
    怎样给 VS 更换皮肤
    SQLSERVER存储过程基本语法
  • 原文地址:https://www.cnblogs.com/gwzz/p/14705933.html
Copyright © 2020-2023  润新知