智能指针

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)...);
    }
原文地址:https://www.cnblogs.com/gwzz/p/14705933.html