赞
踩
- #include<boost/enable_shared_from_this.hpp>
-
- //获得指向this的shared_ptr
- /*
- weak_ptr的一个重要用途是用来获得this的shared_ptr,使对象自己能够生产shared_ptr管理自己:
- */
- /*
- 这个解决方案被实现为一个惯用法,在头文件<boost/enable_shared_from_this>中定义了一个助手类enable_shared_from_this<T>
- 使用的时候只需要让想被shared_ptr管理的类从它继承即可
- 需求: 在类的内部需要自身的shared_ptr 而不是this裸指针
- 场景: 在类中发起一个异步操作, callback回来要保证发起操作的对象仍然有效.
- 作者:尤不二
- 链接:http://www.zhihu.com/question/30957800/answer/50181754
- 来源:知乎
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- struct A {
- void func() {
- // only have "this" ptr ?
- }
- };
- int main() {
- A* a;
- std::shared_ptr<A> sp_a(a);
- }
- 当A* a被shared_ptr托管的时候,如何在func获取自身的shared_ptr成了问题.
- 如果写成:
- void func() {
- std::shared_ptr<A> local_sp_a(this);
- // do something with local_sp_a
- }
- 又用a新生成了一个shared_ptr: local_sp_a, 这个在生命周期结束的时候可能将a直接释放掉.
- 这里就需要用enable_shared_from_this改写:
- struct A : public enable_shared_from_this {
- void func() {
- std::shared_ptr<A> local_sp_a = shared_from_this();
- // do something with local_sp
- }
- };
- shared_from_this会从weak_ptr安全的生成一个自身的shared_ptr.
- */
- class self_shared :public enable_shared_from_this<self_shared> { //一个需要用shared_ptr自我管理的类
- public:
- self_shared(int n):x(n){}
- int x;
- void print() {
- std::cout << "self_shared:" << x << std::endl;
- }
- };
- void eg_shared_from_this() {
-
- shared_ptr<self_shared> sp = make_shared<self_shared>(10); //获取指向对象的shared_ptr指针
- std::cout << "use count:" << sp.use_count() << std::endl;
- sp->print();
- shared_ptr<self_shared> sp1 = sp->shared_from_this();
- std::cout << "use count:" << sp.use_count() << std::endl;
- shared_ptr<self_shared> sp2 = sp;
- std::cout << "use count:" << sp.use_count() << std::endl;
- sp2->x = 1000;
- sp2->print();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。