当使用shared_ptr从unique_ptr到基类时,未初始化Enable_shared_from_this.为什么

enable_shared_from_this not initialized while using shared_ptr from unique_ptr to base class. why?

本文关键字:shared ptr 初始化 Enable from 为什么 this unique 基类      更新时间:2023-10-16

我有这样的代码:

#include <iostream>
#include <memory>
#include <string>
class base {
public:
  virtual void method() = 0;
  virtual ~base() = default;
};
class test: public base, public std::enable_shared_from_this<test> {
private:
  std::string text;
public:
  test(std::string text): text(std::move(text)) {}
  ~test() = default;
  virtual void method() override {
    std::cout << "text: " << text;
    std::cout << " this: " << this->shared_from_this().get() << std::endl;
  }
  static std::unique_ptr<base> create(std::string text) {
    return std::unique_ptr<base>(new test(std::move(text)));
  }
};
static auto create_test(std::string text) {
  return test::create(std::move(text));
}
int main(int argc, char* argv[]) {
  std::shared_ptr<base> shared = create_test("some text");
  shared->method();
  return 0;
}

当我运行这个程序时,我得到异常"bad_weak_ptr"。你能解释为什么"enable_shared_from_this"没有初始化吗?

当我将unique_ptr<base>的实例更改为unique_ptr<test>时,它可以工作。

$ ./test 
terminate called after throwing an instance of 'std::bad_weak_ptr'
   what():  bad_weak_ptr
text: some textAborted (core dumped)

你还期待什么?您正在使用shared_ptr<base>。Base不是从enable_shared_from_this继承的,所以它的共享指针不能初始化shared_from_this使用的弱引用。

完全按照设计工作

您可以使用以下create函数将由test构建的共享指针强制转换为base:

static std::shared_ptr<base> create(std::string text) {
    return std::shared_ptr<test>(new test(std::move(text)));
}

否则,它将不起作用。
enable_shared_from_this按预期工作,但考虑以下问题:

std::enable_shared_from_this允许当前由名为pt的std::shared_ptr管理的对象t安全地生成额外的std::shared_ptr实例pt1, pt2,…所有t和pt共享所有权

在您的代码中,您没有从test中创建任何shared_pointer
上面的create函数完成了这项工作。