问题标签 [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++ - 强制将对象创建为 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
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 也会发生错误。请分享你的智慧。谢谢!
c++ - std::enable_shared_from_this,非虚析构函数和公共继承
该类std::enable_shared_from_this
是一个(模板)mixin,推荐用于从给定对象(或其地址)创建共享指针,它们都具有对象的共同所有权。
问题是,如果你有一个 T 类:
- 有虚方法
- 继承自
std::enable_shared_from_this<T>
(并且继承必须是公开的,如上面的链接中所述;否则 mixin 是无用的) - 使用 GCC 编译
-Wnon-virtual-dtor
(也许还有 clang,我不确定)
您会收到有关std::enable_shared_from_this
.
我的问题是 - 这里的错误在哪里?那是...
- 应该
std::enable_shared_from_this
有一个虚拟析构函数吗?(我不这么认为) - 非虚拟析构函数警告是否应该使用一些标准来确定它何时发出(如果完全启用,那就是)?
- 应该保护析构函数
std::enable_shared_from_this
吗?(这甚至会起作用吗?) - 带有这个 mixin 的类应该根本没有虚拟方法吗?
我很困惑。
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
传递给其他人。
c++ - 对象初始化时与智能指针共享所有权
我有一个类A
,它有一个指向类的成员指针B
:
在我的main
函数中,我创建了一个shared_ptr
类A
,然后使用这两个类的一些方法。
但是,在使用 , 的方法之前B
,func1()
我想重置spA
指针。但是spA
指向的对象,还不允许被销毁(设计要求,因为指向的对象spB
可以持有对某些A
成员的引用)。
为了能够做到这一点,我认为B
还可以持有一个指针A
,让我们说A* m_A
。但是由于B
是从A
的构造函数创建的,所以还没有A
对象需要初始化m_A
。
传入this
的A
构造函数 tocreateB(this)
并不能解决问题,因为它不与spA
在第一行创建的共享所有权main()
,所以它不会阻止指向的对象spA
在 之后被完全销毁spA.reset()
。
我的另一种选择是创建m_A
一个shared_ptr
, 但将' 的构造函数传递给shared_from_this()
要么是不可能的,因为该对象尚未创建。A
createB(this->shared_from_this())
A
你对如何解决这个问题有什么建议吗?
c++ - 智能指针作为使用 std::function、std::bind 的函数的参数
错误:
我不明白。请帮忙!!!
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, ? >...
或其他地方的适当公式中......
我究竟做错了什么?
谢谢
c++ - 何时使用 shared_from_this()
如果我想为 A 类返回一个 shared_ptr,我应该使用 shared_from_this() 功能。但是我认为在我已经为 A 定义了 shared_ptr 之后这将起作用。因此,如果另一个地方想要一个 shared_ptr,我只需使用我制作的那个。我想知道何时使用 shared_from_this()。
示例代码: