enabled_shared_from_this

来源:互联网 发布:avast淘宝激活 编辑:程序博客网 时间:2024/05/16 18:27
#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
原创粉丝点击