当使用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?
我有这样的代码:
#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
函数完成了这项工作。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理