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)...);
}