问题标签 [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.
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?
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_this
,std::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_ptr
std::shared_ptr
图书馆的工作方式似乎很奇怪,因为它在很容易成功的情况下失败了。我想知道是否有我不理解的设计注意事项/限制。
我在 C++17 模式下使用 Clang 8.0.0。
c++ - 移动构造函数是否使 shared_from_this 无效
我想用一个包含不可复制成员的类开始一个线程。为了与线程通信,我想在将对象移入线程之前从对象创建一个共享指针。
移动构造函数是否使共享指针无效?如果是这样,那么优雅的 C++ 方法是什么?一种解决方案是将 MessageClient 包装到共享指针中,但这会绕过移动构造函数。
编辑
我得到了我的答案。我现在明白我使用的enable_shared_from_this
不正确,但真正的答案是,没有办法解决不涉及将对象包装到另一个对象中的问题,例如智能指针或 lambda 函数(将对象包装到函子)。我个人发现第二种解决方案更简单,这就是我选择它的原因。
编辑2
我找到了一个更明显的解决方案。如果我从对象创建引用,则不必包装它:
c++ - 如果继承不是公开的而不是出错,为什么 enable_shared_from_this 会崩溃
我在一个项目中使用 shared_ptr 。在某一时刻,我不得不将原始指针存储为 void,然后在传递 void* 的回调中将其转换回其 shared_ptr 形式。但由于某种原因,代码不断崩溃。我不明白为什么,因为我没有收到任何编译器错误或警告。但我注意到,当我从那里继承时,std::enable_shared_from_this
我并没有将它指定为公共继承。这就是导致崩溃的原因。
我写了一个示例代码,我只是想知道为什么会这样。
所以该代码将执行并运行良好,我得到了预期的结果。
但是当我从继承中删除 public 时:
然后它会导致崩溃。那么为什么public
在这里有所作为,为什么编译器不给出警告/错误呢?
c++ - shared_ptr 和 weak_ptr 失败的小例子
我在使用shared_ptr
和weak_ptr
时遇到问题enable_shared_from_this
。
当我用谷歌搜索我所看到的症状时,每个人都建议“shared_from_this()
当没有shared_ptr
实例拥有你的对象时,你不能使用。
但这不是我的情况。
考虑这段代码:
这两种方法MyClass
都会使程序崩溃。我一定遗漏了一些明显的东西——它是什么?
c++ - 多继承调用 shared_from_this 导致的 Bad_weak_ptr
我试图理解为什么bad_weak_ptr
调用时会出现异常shared_from_this
。
我发现通过使class parent
继承虚拟化,这个问题似乎不会持续存在。为什么这不是编译时错误?当找不到正确的继承父级时,类似于“模棱两可的函数调用”?
仅包含父类的 API 无法提前知道继承层次结构,调用 compare 方法(在父类中)将导致运行时错误。是否可以在编译时检测到此类错误?
c++ - 在抛出 'std::bad_weak_ptr' what(): bad_weak_ptr?
我正在学习智能指针和shared_from_this
. 在类继承关系中,这将很难理解。
我有两个基类CA
and CB
,它们派生自enable_shared_from_this
,子类CC
派生自CA
and CB
。我想从类 self 中取出三个类的共享指针,所以我写了sharedCAfromThis
,sharedCBfromThis
和sharedCCfromthis
.
但我错了问题是:
为什么我会收到此错误消息?
你好,是的,非常感谢,我把private改成public了,但是问题依然存在。我的 gcc 版本是 8.0;我将代码更改如下。
c++ - enable_shared_from_this 必须是第一个基类吗?
我的类继承自多个基础,其中之一是std::enable_shared_from_this
. 一定是第一垒吗?
假设以下示例代码:
当~A()
和~B()
运行时,我可以确定C
居住的存储仍然存在吗?
c++ - 如何在超类和子类中使用 std::enable_shared_from_this?
我有两个类,A
并且的子类B
在哪里。我需要两个类来使用.B
A
std::enable_shared_from_this
我试过这个:
(为了避免shared_from_this()
模棱两可,我必须完全限定它B::insertme
。)
当我运行上面的程序时,我得到这个输出:
所以A::insertme
有效,但B::insertme
没有。
我在 Linux 下使用 GCC 9.1.0。
我究竟做错了什么?