Missmiaom
2/20/2020 - 7:08 AM

智能指针

enable_shared_from_this

在使用 shared_from_this() 前,必须先创建一个 shared_ptr 包裹的指针对象,否则会抛出 bad_weak_ptr 异常

多重继承

如果多个继承于 enable_shared_from_this<T> 的类,他们的公共子类在使用 shared_from_this() 时可能会造成二义性,计数紊乱,导致崩溃或者内存泄漏。

正确做法应该使用虚拟继承实现:

class virtual_enable_shared_from_this_base:
   std::enable_shared_from_this<virtual_enable_shared_from_this_base> {
  public:
   virtual ~virtual_enable_shared_from_this_base() {}
};

template<typename T>
class virtual_enable_shared_from_this:
virtual virtual_enable_shared_from_this_base {
  public:
   std::shared_ptr<T> shared_from_this() {
      return std::dynamic_pointer_cast<T>(
         virtual_enable_shared_from_this_base::shared_from_this());
   }
};

class A: virtual_enable_shared_from_this<A> {};
class B: virtual_enable_shared_from_this<B> {};
class Z: public A, public B { };
int main() {
   std::shared_ptr<Z> z = std::make_shared<Z>();
   std::shared_ptr<B> b = z->B::shared_from_this();
}