enable_shared_from_this

1. 为什么要有enable_shared_from_this

StackOverflow上的一个回答比较精炼:“当你只有一个this指针的时候,它(enable_shared_from_this)可以让你获得一份指向this的shared_ptr实例”。

It enables you to get a valid shared_ptr instance to this, when all you have is this. Without it, you would have no way of getting a shared_ptr to this, unless you already had one as a member.

比较常见的一个误解时,你都有this指针了,获取shared_ptr岂不是易如反掌?

struct A {
  void func() {
    // only have "this" ptr ?
  }
};

// func內只有this可用,此时想获得一个指向它的shared_ptr
void func() {
  std::shared_ptr<A> local_sp_a(this);
  // do something with local_sp_a
}

问题是,这个local_sp_a是新生成的智能指针,跟已有的指向this的指针没有关联上,有两份引用计数。这会导致重复释放。

2. 使用方法

struct A : public enable_shared_from_this<A> {
  void func() {
    std::shared_ptr<A> local_sp_a = shared_from_this();
    // do something with local_sp
  }
};

有几个需要注意的地方:

  • public继承
  • enable_shared_from_this是个模板
  • 头文件 memory
  • 获取sp的方法是shared_from_this

3. 如何实现的

enable_shared_from_this<T>内部会留存一份std::weak_ptr<T>成员,在调用shared_from_this时,会从weak_ptr安全的生成一个自身的shared_ptr。

TODO:探索一下实现的代码。

4. 参考

https://en.cppreference.com/w/cpp/memory/enable_shared_from_this

https://stackoverflow.com/questions/712279/what-is-the-usefulness-of-enable-shared-from-this

https://www.zhihu.com/question/30957800

https://www.jianshu.com/p/4444923d79bd

posted @ 2020-10-26 11:08  不写诗的诗人小安  阅读(369)  评论(0编辑  收藏  举报