2019/05/16
6,655
一. 引入
简单地说: enable_shared_from_this 是为了解决 在类的内部获取自己的 shared_ptr 这件事情而存在的。
众所周知, 每一个对象都能通过this 指针来访问自己的地址。this 指针也是所有成员函数的隐含参数。然而有些时候,我们需要的不仅是 this,而是一个 “this的智能指针”。
这里有一个常见的场景:
class A {
public:
A() :did_it_(false) {}
~A() {
std::cout << "destoried" << std::endl;
}
void OnDo(bool did) {
did_it_ = did;
std::cout << "somthing did" << std::endl;
}
void DoSth_Async() {
std::thread t([this]() {
std::this_thread::sleep_for(std::chrono::seconds(5));
//...do somthing
OnDo(true);
});
t.detach();
}
private:
bool did_it_;
};
代码如上:在异步方法 DoSth_Async() 中调用了成员方法 OnDo(bool) . 这里存在一个问题: 当 OnDo() 被调用的时候,该类的是否还在生存中:
int main(){
{
std::shared_ptr<A> ptr(new A());
ptr->DoSth_Async();
}
std::this_thread::sleep_for(std::chrono::seconds(5));
return 0;
}
智能指针 ptr 在出作用域后立即被释放。所以当 OnDo() 被调用的时候,其所在的对象实际已经被释放了。如果确保在 OnDo() 被调用的时候,该对象仍然在生命周期内呢?一个方便的方法便上在构建线程的时候,将该对象的 shared_ptr 传入到线程。在该线程的生命周期内,该对象就会一直存在。这是一种利用 shared_ptr 的 保活机制 。