智能指针
2021/4/26 18:55:40
本文主要是介绍智能指针,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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)...); }
这篇关于智能指针的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?