首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么std::enable_shared_from_this允许多个std::shared_ptr实例?

为什么std::enable_shared_from_this允许多个std::shared_ptr实例?
EN

Stack Overflow用户
提问于 2019-06-06 01:44:13
回答 3查看 386关注 0票数 2

有几个问题涵盖了std::enable_shared_from_this的行为,但我不认为这是重复的。

std::enable_shared_from_this继承的类带有一个std::weak_ptr成员。当应用程序创建指向std::enable_shared_from_this的子类的std::shared_ptr时,std::shared_ptr构造函数将检查该std::weak_ptr,如果它未初始化,则对其进行初始化,并对std::shared_ptr使用std::weak_ptr控制块。但是,如果std::weak_ptr已经初始化,则构造函数只创建一个带有新控制块的新std::shared_ptr。这会将应用程序设置为在两个std::shared_ptr实例之一的引用计数变为零时崩溃,并删除底层对象。

代码语言:javascript
复制
struct C : std::enable_shared_from_this<C> {};

C *p = new C();
std::shared_ptr<C> p1(p);

// Okay, p1 and p2 both have ref count = 2
std::shared_ptr<C> p2 = p->shared_from_this();

// Bad: p3 has ref count 1, and C will be deleted twice
std::shared_ptr<C> p3(p);

我的问题是:为什么图书馆会这样做?如果std::shared_ptr构造函数知道对象是一个std::enable_shared_from_this子类,并且不厌其烦地检查std::weak_ptr字段,那么为什么它不总是对新的std::shared_ptr使用相同的控制块,从而避免潜在的崩溃呢?

就此而言,为什么在std::weak_ptr成员未初始化时shared_from_this方法会失败,而不是只初始化它并返回std::shared_ptr

这个库的工作方式似乎很奇怪,因为它在可能很容易成功的情况下失败了。我想知道是否有我不理解的设计注意事项/限制。

我在C++17模式下使用Clang 8.0.0。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56465544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档