在使用 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();
}