#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();
}
enabled_shared_from_this
最新推荐文章于 2022-12-15 10:15:59 发布