问题标签 [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 回答
92 浏览

c++ - 强制将对象创建为 shared_ptr 的断言?

使用时std::shared_ptr,它通常很有用,std::enable_shared_from_this<T>以便您可以访问该shared_from_this()功能。

using 的一项要求shared_from_this()是对象的所有实例都使用std::shared_ptr. 虽然这是一个非常好的要求,但对课程的未来用户来说很难强制执行。

如果我创建一个对象:

然后有人 - 也许几年后 - 使用这个类而不将其构造为 shared_ptr ...

然后我们得到一个运行时崩溃:

需要明确的是,我理解这个问题的解决方案是:

(当然需要确保shared_ptr存在足够长的时间以使异步回调执行,但我在这里忽略了这一点)。

我的问题是 - 我们如何在继承自的对象的构造函数中添加某种静态断言,以便在编译时而不是运行时获取std::enable_shared_from_this<T>该对象的任何构造而不是a ?std::shared_ptr

0 投票
1 回答
327 浏览

c++ - enable_shared_from_this 返回 bad_weak_ptr 错误

我在我的项目中使用 boost 库。当我在编写 rest http 客户端代码时,我收到了这个错误。

libc++abi.dylib:以 std::__1::bad_weak_ptr: bad_weak_ptr 类型的未捕获异常终止

即使我没有在构造函数中调用 shared_from_this 也会发生错误。请分享你的智慧。谢谢!

0 投票
1 回答
112 浏览

c++ - std::enable_shared_from_this,非虚析构函数和公共继承

该类std::enable_shared_from_this是一个(模板)mixin,推荐用于从给定对象(或其地址)创建共享指针,它们都具有对象的共同所有权。

问题是,如果你有一个 T 类:

  1. 有虚方法
  2. 继承自std::enable_shared_from_this<T>(并且继承必须是公开的,如上面的链接中所述;否则 mixin 是无用的)
  3. 使用 GCC 编译-Wnon-virtual-dtor(也许还有 clang,我不确定)

您会收到有关std::enable_shared_from_this.

我的问题是 - 这里的错误在哪里?那是...

  • 应该std::enable_shared_from_this有一个虚拟析构函数吗?(我不这么认为)
  • 非虚拟析构函数警告是否应该使用一些标准来确定它何时发出(如果完全启用,那就是)?
  • 应该保护析构函数std::enable_shared_from_this吗?(这甚至会起作用吗?)
  • 带有这个 mixin 的类应该根本没有虚拟方法吗?

我很困惑。

0 投票
1 回答
203 浏览

c++ - 为什么 std::enable_shared_from_this 不使用可变的 std::weak_ptr?

我了解大多数 std 库实现选择std::enable_shared_from_this通过将 a 存储std::weak_ptr在基类中来实现。这导致以下情况:

我似乎很清楚,尽管需要更新引用计数,shared_from_this()但实际上并没有改变目标对象。这似乎是可变对象的理想用途,因此shared_from_this()可以将其标记为const相对于派生对象。

为什么不使用 实现mutable

为了阐明下面的答案:它是用std::weak_ptr标记的 实现的mutable,但这只允许std::weak_ptr被突变,而不是让我们将非const传递给其他人。

0 投票
0 回答
31 浏览

c++ - 对象初始化时与智能指针共享所有权

我有一个类A,它有一个指向类的成员指针B

在我的main函数中,我创建了一个shared_ptrA,然后使用这两个类的一些方法。

但是,在使用 , 的方法之前Bfunc1()我想重置spA指针。但是spA指向的对象,还不允许被销毁(设计要求,因为指向的对象spB可以持有对某些A成员的引用)。

为了能够做到这一点,我认为B还可以持有一个指针A,让我们说A* m_A。但是由于B是从A的构造函数创建的,所以还没有A对象需要初始化m_A

传入thisA构造函数 tocreateB(this)并不能解决问题,因为它不与spA在第一行创建的共享所有权main(),所以它不会阻止指向的对象spA在 之后被完全销毁spA.reset()

我的另一种选择是创建m_A一个shared_ptr, 但将' 的构造函数传递给shared_from_this()要么是不可能的,因为该对象尚未创建。AcreateB(this->shared_from_this())A

你对如何解决这个问题有什么建议吗?

0 投票
2 回答
47 浏览

c++ - 智能指针作为使用 std::function、std::bind 的函数的参数

错误:

我不明白。请帮忙!!!

0 投票
1 回答
38 浏览

multiple-inheritance - pybind11,使用 std::enable_shared_from_this 绑定 Trampolines 和多重继承时编译失败

我有一个多重继承与蹦床相结合的编译问题。下面的代码解释了这个问题:

不久,

  • A 类有一个纯虚方法 - 所以需要一个 tranpoline (PyA)。
  • B 类继承自 A,具有虚拟方法 - 所以需要一个蹦床 (PyB)。
  • B 类也继承自 std::enable_shared_from_this - 所以我有多重继承
  • 无论我为 B 类做什么绑定语句 - 编译器都会抱怨。

接下来是 c++17 的输出:

如果我尝试使用另一个简单的类(C)而不是std::enable_shared_from_this一切正常。所以问题可能出在在线py:class_<B, PyB, ? >...或其他地方的适当公式中......

我究竟做错了什么?

谢谢

0 投票
1 回答
71 浏览

c++ - 何时使用 shared_from_this()

如果我想为 A 类返回一个 shared_ptr,我应该使用 shared_from_this() 功能。但是我认为在我已经为 A 定义了 shared_ptr 之后这将起作用。因此,如果另一个地方想要一个 shared_ptr,我只需使用我制作的那个。我想知道何时使用 shared_from_this()。

示例代码: