<C++>shared_ptrs利用std::enable_shared_from_this()实现安全管理this指针
来源:互联网 发布:杭州淘宝客服真实工资 编辑:程序博客网 时间:2024/05/16 09:37
智能指针大法好,但是坑儿免不了,不要哭来不要闹,C艹面前谁敢diao
利用RAII来管理资源自然是高效,但是对于一些比较特殊的类型,还是会有不得不注意的地方,没错说的就是std::shared_ptr
和this
指针的搭配。 shared_ptr
的内部实现包括一个指向目标对象的raw pointer
和一个包含reference count
等其他维护sp状态的数据结构,称之为控制块(control block)
,形如下图:
一个被shared_ptr
包裹的对象原则上只能有一块control block
,这样子对象的生命周期才能被正确管理,control block
的建立遵循以下三条原则:
- 当
shared_ptr
是从一个raw pointer
构造而来时 - 当
shared_ptr
从一个unique_ptr
构造而来时 - 当
shared_ptr
通过make_shared
函数构造而来时
以上可以看出,连续的从同一个raw pointer
构造智能指针是一种非常不好的编程习惯:
auto pt=new Object;std::shared_ptr spt(pt);std::shared_ptr spt2(pt);
以上,应该绝对避免,或者就像下面这样写:
auto pt=new Object;std::shared_ptr spt(pt);std::shared_ptr spt2{spt};
接下来进入正题!
当在类内想通过对this
指针进行包裹来达到自动管理资源的目的时,很容易写出这样的代码:
class Object;std::vector<std::shared_ptr<Object>> spts_obj;//...class Object{public: void process();}//...void Object::process(){ spts_obj.emplace_back(this);}
想法没毛病,只是想通过多个shared_ptr
管理同一个对象罢了,但是!! 当通过this
指针构造shared_ptr
时,是会重新构造一个control block
时的,不同的control block
管理着同一个对象,指甲盖想想都知道大错特错了。
这时候就该std::enable_shared_from_this()
出场了。cppreference std::enable_shared_from_this()
是一个模板类,使得多个通过this
构造的智能指针共享同一块control block
成为可能。
它有两个重要的成员函数:
- shared_from_this:返回一个共享同一个
this
指针的shared_ptr
对象 - weak_from_this:返回一个共享同一个
this
指针的weak_ptr
对象
以及一个成员对象:
- weak_this:一个追踪
control block
状态的std::weak_ptr
对象
将之前的代码改写一下,就可以做到多个shared_ptr
安全管理同一个this
指针了。
class Object;std::vector<std::shared_ptr<Object>> spts_obj;//...class Object: public std::enable_shared_from_this<Object>{public: void process();}//...void Object::process(){ spts_obj.emplace_back(shared_from_this());}
注意一定是public
继承!!!
虽然这样的继承写法看起来有点鬼畜,但是成功达到了目的不是么。
- <C++>shared_ptrs利用std::enable_shared_from_this()实现安全管理this指针
- 从 this 指针获得一个shared_ptr: enable_shared_from_this
- 【C/C++】this指针
- 利用this指针实现对象资源的拷贝
- std::tr1::shared_ptr、std::tr1::weak_ptr及std::tr1::enable_shared_from_this
- C++this指针、智能指针
- 【C++】this 指针
- C++this指针
- C++this指针
- C++this指针
- C++this指针
- C++this指针
- c++this指针
- C++this指针
- C++this指针
- C++this指针(二)
- C++-this指针
- c++this指针
- sql增删改查语句
- HDU5119 Happy Matt Friends (dp && 0-1背包)
- 堆栈学习笔记
- 实验三 Linux文件管理
- Docker入门系列(三):让你的应用变为可扩展的服务
- <C++>shared_ptrs利用std::enable_shared_from_this()实现安全管理this指针
- matlab灰度直方图的2种绘制方法
- 在Eclipse中使用JUnit4进行单元测试
- linux 手工释放内存 高内存 内存回收 方法思路
- php 错误级别日志
- 数组
- 12、信号(2)
- Docker入门系列(四):让你的服务跨越多台机器
- HDU 5188 zhx and contest 基础DP.