问题标签 [enable-shared-from-this]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
692 浏览

c++ - enable_shared_from_this 中的空弱指针

在公开继承 enable_shared_from_this 并初始化类的对象后,在调用该类的另一个函数时,我在 Visual Studio 中调试时仍然可以看到 enable_shared_from_this_class 的空弱指针。

所有现有问题都是由于从 enable_shared_from_this 私下继承或在构造函数中调用 weak_from_this。这不是我的情况。我目前正在使用 c++ catch 框架在 Visual Studio 调试器中测试这个场景。在 Initialize 函数中,我可以看到,这个对象的 weak_ptr 是空的。

头文件:

cp文件:

测试用例:(使用 cpp catch 框架)

编辑:根据评论,要求正确,Env 模块将由一个插件管理,该插件将创建一个 unique_ptr 并调用 Initialize。就像是:

我仍然面临同样的问题。在这种情况下,我该如何管理 Env?

0 投票
4 回答
418 浏览

c++ - 为什么 std::enable_shared_from_this 允许多个 std::shared_ptr 实例?

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

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

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

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

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

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

0 投票
2 回答
244 浏览

c++ - 移动构造函数是否使 shared_from_this 无效

我想用一个包含不可复制成员的类开始一个线程。为了与线程通信,我想在将对象移入线程之前从对象创建一个共享指针。

移动构造函数是否使共享指针无效?如果是这样,那么优雅的 C++ 方法是什么?一种解决方案是将 MessageClient 包装到共享指针中,但这会绕过移动构造函数。

编辑

我得到了我的答案。我现在明白我使用的enable_shared_from_this不正确,但真正的答案是,没有办法解决不涉及将对象包装到另一个对象中的问题,例如智能指针或 lambda 函数(将对象包装到函子)。我个人发现第二种解决方案更简单,这就是我选择它的原因。

编辑2

我找到了一个更明显的解决方案。如果我从对象创建引用,则不必包装它:

0 投票
2 回答
327 浏览

c++ - 如果继承不是公开的而不是出错,为什么 enable_shared_from_this 会崩溃

我在一个项目中使用 shared_ptr 。在某一时刻,我不得不将原始指针存储为 void,然后在传递 void* 的回调中将其转换回其 shared_ptr 形式。但由于某种原因,代码不断崩溃。我不明白为什么,因为我没有收到任何编译器错误或警告。但我注意到,当我从那里继承时,std::enable_shared_from_this我并没有将它指定为公共继承。这就是导致崩溃的原因。

我写了一个示例代码,我只是想知道为什么会这样。

所以该代码将执行并运行良好,我得到了预期的结果。

但是当我从继承中删除 public 时:

然后它会导致崩溃。那么为什么public在这里有所作为,为什么编译器不给出警告/错误呢?

0 投票
1 回答
212 浏览

c++ - enable_shared_from_this什么时候有用?

0 投票
2 回答
1595 浏览

c++ - shared_ptr 和 weak_ptr 失败的小例子

我在使用shared_ptrweak_ptr时遇到问题enable_shared_from_this

当我用谷歌搜索我所看到的症状时,每个人都建议“shared_from_this()当没有shared_ptr实例拥有你的对象时,你不能使用。

但这不是我的情况。

考虑这段代码:

这两种方法MyClass都会使程序崩溃。我一定遗漏了一些明显的东西——它是什么?

0 投票
1 回答
297 浏览

c++ - 多继承调用 shared_from_this 导致的 Bad_weak_ptr

我试图理解为什么bad_weak_ptr调用时会出现异常shared_from_this

我发现通过使class parent继承虚拟化,这个问题似乎不会持续存在。为什么这不是编译时错误?当找不到正确的继承父级时,类似于“模棱两可的函数调用”?

仅包含父类的 API 无法提前知道继承层次结构,调用 compare 方法(在父类中)将导致运行时错误。是否可以在编译时检测到此类错误?

0 投票
2 回答
2903 浏览

c++ - 在抛出 'std::bad_weak_ptr' what(): bad_weak_ptr?

我正在学习智能指针和shared_from_this. 在类继承关系中,这将很难理解。

我有两个基类CAand CB,它们派生自enable_shared_from_this,子类CC派生自CAand CB。我想从类 self 中取出三个类的共享指针,所以我写了sharedCAfromThis,sharedCBfromThissharedCCfromthis.

但我错了问题是:

为什么我会收到此错误消息?

你好,是的,非常感谢,我把private改成public了,但是问题依然存在。我的 gcc 版本是 8.0;我将代码更改如下。

0 投票
3 回答
194 浏览

c++ - enable_shared_from_this 必须是第一个基类吗?

我的类继承自多个基础,其中之一是std::enable_shared_from_this. 一定是第一垒吗?

假设以下示例代码:

~A()~B()运行时,我可以确定C居住的存储仍然存在吗?

0 投票
2 回答
337 浏览

c++ - 如何在超类和子类中使用 std::enable_shared_from_this?

我有两个类,A并且的子类B在哪里。我需要两个类来使用.BAstd::enable_shared_from_this

我试过这个:

(为了避免shared_from_this()模棱两可,我必须完全限定它B::insertme。)

当我运行上面的程序时,我得到这个输出:

所以A::insertme有效,但B::insertme没有。

我在 Linux 下使用 GCC 9.1.0。

我究竟做错了什么?