enabled_shared_from_this

#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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值