问题标签 [weak-ptr]
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++ - 带有 weak_ptr 的 HippoMocks
只是遇到了代码的编译错误,试图模拟一个std::weak_ptr
作为参数的方法。HippoMocks
在调用方法时有一个代码来比较它With
,它不会被编译。我将不胜感激任何帮助。
这是代码:
MS VS 2010 编译器不喜欢最后一行并抱怨:
c++ - C++11 标准决策“shared_ptr(const weak_ptr& r) 抛出 bad_weak_ptr"
有没有搞错 ?(后面引用的真实问题以粗体表示)
§ 20.7.2.2.1
template<class Y> explicit shared_ptr(const weak_ptr<Y>& r);
23 要求:Y*
应可转换为T*
. 24 效果:构造一个与 r 共享所有权的 shared_ptr 对象,并存储存储在 r 中的指针的副本。
25 后置条件:use_count() == r.use_count()
.
26 次投掷:bad_weak_ptr
当r.expired()
.
27 异常安全:如果抛出异常,构造函数没有任何作用。
这不是提升行为。由过期的弱构造的共享提供了一个空的共享。您可以在布尔上下文中对其进行测试。
为什么委员会选择了例外的方式?例如,谷歌 C++ 指南完全禁止使用异常。具有此类准则的项目,甚至在构建时禁用异常(在授权禁用的编译器上)将如何做?
最后,如果这可能经常发生(开发人员依赖过期指针检测作为正常程序流程),它会不会很慢(对于实时程序)?我记得一篇文章提到了实现异常的两种可能的策略,一种是在异常发生时减慢一切,但不是真的,另一种仅在发生异常时才变慢,但不会影响其余部分。我想这在某种程度上仍然是正确的。
c++ - 关于weak_ptr的线程安全
关于上面的代码,我知道不同的线程读取和写入相同的线程shared_ptr
会导致竞争条件。但是怎么样weak_ptr
?下面的代码中是否有任何竞争条件?(我的平台是微软VS2013。)
multithreading - 关于weak_ptr的竞争条件
1.我几天前发布了这个问题(关于weak_ptr的线程安全),我现在有另一个相关的问题。如果我做这样的事情,会在上面的例子中引入一个竞争条件作为 g_w 吗?(我的平台是 ms vs2013)
2.据我所知,从std::tr1::shared_ptr/weak_ptr派生的std::shared_ptr/weak_ptr和从boost::shared_ptr/weak_ptr派生的std::tr1::shared_ptr/weak_ptr,在实现上有什么区别吗?特别是在线程安全方面。
c++ - 如何将两个 std::maps 与 std::weak_ptr 作为键进行比较?
我有这样的代码:
我想比较这个类的两个实例,但是我得到编译器错误:
看到no match for operator
了,我添加了以下代码,但没有帮助。
当我尝试以下操作时,错误仍然存在:
- 添加
constexpr
到任何此运算符; - 像这样向地图添加自定义比较器:
std::map<std::weak_ptr<int>, int, std::owner_less<std::weak_ptr<int>>>
.
我可以通过以下方式编译此代码:
- 将运算符 return 语句替换为:
return true
; - 将权重成员的类型更改为不使用
std::weak_ptr
,例如std::map<int, int>
: - 将自定义比较运算符添加到不比较映射但比较每个键和值的类元素。
选项 1. 和 2. 只是为了测试而不是选项;3. 可能,但我想了解为什么会出现此错误并尽可能使用标准库。在我的理解中,它应该编译:std::map
有一个operator<
,它比较内部树,它应该比较pairs<key, data>
,它比较对中的第一个和第二个元素,至少如果提供了一个operator<
for应该工作weak_ptr
。
但它不起作用(至少不适用于 g++ 4.8.{1,2}),因此我的问题是:
- 为什么它不起作用,为什么我会收到此错误消息?
- 如何将两个
maps
与weak_ptr
as 键进行比较?
更新,std::lexicographical_compare
按照 KerrekSB 的建议使用。
我正在尝试比较两个不同的地图。在下面的示例中,映射 m1 和 m2 具有相同的键,但使用此键存储不同的值。如果比较这两个映射,它们应该不相等,应该排序在另一个之前。
如图所示的输出表明两者相等:
但它们不是,通过使用注释比较,结果变为:
所以这给我留下了:
- 我必须做什么才能使默认的词典比较做我想要比较这些对的事情?
- 从问题的原始部分来看,为什么会出现此错误,尤其是导致 constexpr 错误的原因?
c++ - shared_ptr、weak_ptr 和循环依赖
我认为我的问题类似于shared_ptr 和 weak_ptr 差异,但我有兴趣了解它们如何协同工作,而不是差异列表。
维基百科关于shared_ptr 和 weak_ptr state a的页面weak_pointer
可以用来解决循环依赖问题,它给出了一个例子:
但我没有看到循环依赖,所以我不明白如何weak_pointer
解决问题。
我本来希望看到一些 objecta
指向一个 object b
,并b
以某种方式指向a
(weak_ptr
在一个有向图边缘之间有一个垫片以打破链)。
这个例子是好的,我的想法是坏的吗?还是有更好的问题和解决方案示例?
c++ - C++:通过 std::weak_ptr 将委托传递给其他对象
我有两个类,例如 A 和 B。我想将 A 作为对 B 的引用。
我想:
- 摆脱裸指针(例如,借助 std::shared_ptr 和 std::weak_ptr)。
- 避免循环引用。
但是有一些问题:
- 如何在 A 类中创建弱指针?首先,我应该确定 A 的一个实例是由一些 shared_ptr 管理的。即使我很确定,我怎样才能找到这个 shared_ptr 实例?
- 一般来说,我怎样才能确保我只通过共享指针使用某个类的实例?我可以尝试创建工厂方法并将构造函数设为私有,但这会导致错误:make_shared 需要公共构造函数。
提前致谢!
编辑:
问题的更详细解释:我有一个类 A。这个类想要将部分工作传递给类 B。所以我在 A 中有一个指向 B 的共享指针。我希望 B 异步执行此操作,而 B 应该当有一些进展或工作完成时调用 A 的回调。所以 B 应该有 A 的引用。
所以问题是:我如何将 A 传递给 B?我可以尝试通过裸指针或引用来做到这一点,但它是安全的,因为 B 不能保证这个引用的对象仍然存在(所有裸指针的常见问题)。所以我想传递一个弱指针,我的问题就是关于它。
c++ - boost::weak_ptr 会抛出异常吗?
我正在阅读这里Boost
的文档,一开始它说:weak_ptr
当对象的最后一个 shared_ptr 消失并且对象被删除时,尝试从引用已删除对象的 weak_ptr 实例获取 shared_ptr 将失败:构造函数将抛出 boost::bad_weak_ptr 类型的异常,并且 weak_ptr: :lock 将返回一个空的 shared_ptr。
到目前为止一切都很清楚,但是,2 行后它说:
weak_ptr 操作从不抛出异常。
每个语句指的是什么?
c++11 - 在析构函数中替代 shared_from_this
虽然我不能shared_from_this()
在 dtor 中使用,但这似乎是一个有效的用例,因为A::remove()
我不关心存储的指针的内存,只关心我假设std::owner_less
和std::owner_before
工作的引用计数块位置。
我可以想到替代方案:
(a) 使用延迟清除(例如,稍后迭代时,A::m_coll
如果您发现通过锁定获得的 shared_ptr 为 null/false,则从集合中删除 weak_ptr)。
(b) 在B
自身中存储一个weak_ptr {当然是通过shared_from_this() 获得的} 并将其传递给A::remove(..)
dtor of B
。
但是是否有任何解决方案可以通过已知的习语实现(例如,如果标准要求将weak_ptr存储在其中,std::enable_shared_from_this
那么我可以在 dtor 中访问它B
并完成工作)?
{顺便说一句,我不能使用上面的 (a),因为我需要在B
inA::m_coll
被破坏时立即触发很多事情。}
c++ - shared_ptr 的循环依赖问题是什么?
我阅读了共享指针并了解了如何使用。但是我从来不理解共享指针的循环依赖问题以及弱指针如何解决这些问题。任何人都可以清楚地解释这个问题吗?