问题标签 [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++ - 使用指针线程化共享模型
我有一个指向用new创建的对象的指针向量。多个线程使用各种获取/设置以安全的方式访问此向量。但是,一个线程可能会删除其中一个对象,在这种情况下,另一个线程指向该对象的指针不再有效。方法如何知道指针是否有效?选项 1 和 2 实际上似乎运作良好。我不知道他们将如何扩展。最好的方法是什么?有便携版3吗?
测试有效的指针有效性示例:
1.使用整数而不是指针。哈希 (std::map) 检查指针是否仍然有效。公共方法如下所示:
2.有一个shared_ptr的向量。每个线程都尝试在其weak_ptr上调用 lock() 。如果返回的 shared_ptr 为 null,我们知道有人在我们等待时删除了它。公共方法如下所示:
3.在纯原始指针上测试 null 吗?这可能吗?
c++ - std::set of boost::weak_ptr- 让 const_iterator 到 const T?
我有一个包含std::set
of 的类boost::weak_ptr<T>
。我有两个函数 begin() 和 end() 将迭代器返回到容器。但是,我不希望客户能够修改T
. 简单地返回 a 是const_iterator
行不通的,因为T
指向的boost::weak_ptr
是可编辑的。
我想要做的是返回一个const_iterator
to std::set<boost::weak_ptr<T const> >
。铸造 fromstd::set<boost::weak_ptr<T> >::const_iterator
不起作用。有没有办法得到我想要的行为?
c++ - weak_ptr 是如何工作的?
我了解如何使用weak_ptr
和shared_ptr
。shared_ptr
通过计算其对象中的引用数,我了解其工作原理。如何weak_ptr
工作?我尝试通读 boost 源代码,但我对 boost 不够熟悉,无法理解它使用的所有东西。
谢谢。
c++ - std::shared_ptr 和双重回调
我有一些逻辑,我将 std::shared_ptrs 用于继承层次结构中的对象。有一次我需要根据它们的真实类型来处理这些对象,所以我使用了双重调度(即我调用基类上的一个方法,然后它又调用另一个具有真实类型的对象上的方法,参见例如GoF 中的访问者模式)。
现在,我可以传递对具有正确类型或副本的对象的引用。出于多种原因,副本是不可能的。引用通常没问题,因为调用发生在 shared_ptr 所在的范围之下,因此在调用发生时它不会被破坏。但是对于某些子类型,我需要将对象存储在 STL 容器中,因此我需要绝对确定它不会被破坏。显然,裸指针或新的 shared_ptrs 在这里不起作用,所以我需要获取对调用 this 的 shared_ptr 的引用。
现在我正在做以下事情:我使用命名构造函数而不是真实的构造函数来创建对象。这会在对象内部设置一个 weak_ptr 并给出一个 shared_ptr 以供对象使用。当双重回调发生时,我从 weak_ptr 获得一个新的 shared_ptr 并将其存储在 Container 中,因此对象不会被破坏。然而,这使我的构造逻辑非常难看。
有没有更好的方法来做到这一点?
c++11 - weak_ptr 的 static_pointer_cast
在 c++0x 中,std::shared_ptr 有一个 std::static_pointer_cast,但 std::weak_ptr 没有等效方法。这是故意的,还是疏忽?如果疏忽,我将如何定义适当的功能?
c++ - 对 scoped_ptr 的弱引用?
一般来说,我遵循谷歌风格指南,我觉得这与我看待事物的方式非常吻合。我也几乎完全使用 boost::scoped_ptr 以便只有一个管理器拥有特定对象的所有权。然后我传递裸指针,我的想法是我的项目的结构使得所述对象的管理器总是在使用它们的对象被销毁后被销毁。
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Smart_Pointers
这一切都很好,但是我只是被一个令人讨厌的小内存踩踏错误咬住了,其中所有者恰好在使用它的对象被删除之前被删除。
现在,在每个人都认为我是这种模式的傻瓜之前,我为什么不直接使用 shared_ptr 呢?等等,考虑一下我不想有未定义的所有者语义这一点。尽管 shared_ptr 会捕捉到这种特殊情况,但它会向系统用户发送错误消息。它说:“我不知道这是谁的,可能是你!”
对我有帮助的是指向作用域指针的弱指针。实际上,一个具有弱引用列表的作用域指针,当作用域指针解构时,这些弱引用被清空。这将允许单一所有权语义,但让使用对象有机会捕捉我遇到的问题。
因此,以一个额外的 'weak_refs' 指针为 scoped_ptr 和一个额外的指针为 'next_weak_ptr' 中的weak_ptr 为代价,它将成为一个简洁的小型单所有者、多用户结构。
它甚至可能只是一个调试功能,因此在“发布”中,整个系统只是变回正常大小的 scoped_ptr 和弱引用的标准单指针。
所以.....毕竟我的问题是:
- stl/boost 中是否已经有这样的指针/模式,我错过了,还是我应该自己滚动?
- 有没有更好的方法,仍然可以满足我的单一所有权目标?
干杯,谢恩
c++ - weak_ptr 奇怪的复制构造函数
以下是两个weak_ptr 的构造函数:http: //msdn.microsoft.com/en-us/library/bb982126.aspx
实际代码(来自memory
):
Q1:为什么顶部的复制构造函数甚至在那里?看起来底部的一个占每个案例(包括顶部的一个)。它甚至被调用吗?如果他们不包括它,底部的会取而代之吗?
Q2:底部(模板化)构造函数的第二个参数发生了什么。我想我了解 SFINAE 方面,但我不明白为什么后面有一个额外的 *::type
c++ - MVP设计模式的STL实现
我正在尝试使用 STL 实现 MVP 模式,并且我使用 *shared_ptr* 和 *weak_ptr* 在重复引用时“打破循环”。
我仍然有一个问题:如何从this指针中获取 shared_ptr ?我看到了 boost 提出的解决方案,但真诚地认为不会走那么远。问题是设置 *weak_ptr* 的唯一方法是从 shared_ptr 中进行,如果我必须在一个自身没有 shared_ptr 的类中执行此操作,那将很难。
所以这里基本上是视图创建模型,但模型需要引用视图来实现观察者模式。问题是我被卡住了,因为我无法为模型设置weak_ptr 视图指针。
还有其他方法吗?:) 这就像说我不相信助推器的人,但事实并非如此。事实上,我的问题是,是否有另一种方法来实现 MVP 而不会一开始就陷入这种混乱。
PS:我正在尝试实现 MVP 监督控制器模式。在代码示例中,我排除了 i_presenter 接口,编译错误进一步上升。如果我尝试被动视图方法,情况也会一样。您可以在此处阅读有关它们的更多信息Model-View-Presenter Pattern。
c++ - c++: std::tr1::shared_ptr from this
我有以下代码:
我开始这个示例,我得到下一个断言:_BLOCK_TYPE_IS_VALID(pHead->nBloakUse)。
我怎样才能避免这种情况?
我使用以下代码来解决此问题:
但我认为有更好的解决方案。
c++ - C++ 中的共享、弱指针和惰性指针
有谁知道惰性初始化伙伴的实现shared_ptr
并与weak_ptr
它一起实现?课程的要求是:
lazy_ptr
允许客户端稍后(如果有的话)构造对象的类,而不需要构造函数实现具有三种可能状态的
weak_lazy_ptr
类:尚未构造(不会锁定到 ashared_ptr
)、构造(将锁定到 ashared_ptr
)和已销毁(不会锁定到 ashared_ptr
)
我创建了一些不久前没有完全完成这项工作的类(请参阅此处的 CVu 文章),它们使用shared_ptr
并weak_ptr
在它们的实现中使用。使用共享指针和弱指针而不是与它们集成的模型的主要问题如下:
一旦所有
lazy_ptr
对象超出范围,任何弱引用都不能再被锁定,即使其他客户端持有shared_ptr
版本无法控制在不同线程上构建对象
我很感激任何关于协调这些问题的其他尝试的指针,或者这个领域可能正在进行的任何工作。