zoukankan      html  css  js  c++  java
  • 智能指针

    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)...);
        }
  • 相关阅读:
    centos7.6 安装与配置 MongoDB yum方式
    MongoDB 介绍
    centos 关闭selinux
    前端 HTML标签属性
    前端 HTML 标签嵌套规则
    前端 HTML 标签分类
    前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
    前端 HTML body标签相关内容 常用标签 表单标签 form 表单控件分类
    前端 HTML form表单标签 select标签 option 下拉框
    POJ 1426
  • 原文地址:https://www.cnblogs.com/gwzz/p/14705933.html
Copyright © 2011-2022 走看看