问题标签 [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 的访问是否明智?
我编写了一个库,它公开了对几种相关对象类型的引用。所有这些对象的生命周期都由库内部通过boost::shared_ptr
库的用户还可以根据库的性质知道任何暴露对象的生命周期。所以他们可以存储指针或保留对这些对象的引用。他们这样做并知道这些对象何时不再有效是合理的。
但我对强迫我的用户讲道理感到内疚。
weak_ptr
让库公开其对象是否可以接受?其他图书馆有这样做过吗?
我已经分析了这个库在应用程序中的使用情况,发现它对任务至关重要,无法weak_ptr
专门公开。
让匹配的 API 函数公开引用或weak_ptr 或让任何对象能够将 a 公开weak_ptr
给自身会更明智吗?
c++ - shared_ptr、订阅、析构函数
我在整个应用程序中使用 Boost/shared_ptr 指针。当对对象的最后一个引用被释放时,shared_ptr 将为我删除该对象。应用程序中的对象订阅应用程序中心位置的事件,类似于观察者/订阅者模式。
在对象析构函数中,对象将从订阅列表中取消订阅。订阅列表本质上只是一个list<weak_ptr<MyObject> >
. 我想做的是与此类似的事情:
我的问题是不能在析构函数中调用 shared_from_this ,所以上面的代码会抛出异常。
在我的旧实现中,订阅列表只是一个指针列表,然后它就起作用了。但我想改用weak_ptr 引用来降低我通过手动内存管理搞砸内存的风险。
由于我依赖 shared_ptr 来执行对象删除,因此我的代码中没有一个地方可以逻辑地调用 Unsubscribe。
关于在这种情况下该怎么做的任何想法?
c++ - 提升,共享ptr与弱ptr?什么时候用?
在我目前的项目中,我使用boost::shared_ptr
得相当广泛。
最近我的队友也开始使用weak_ptr
. 我不知道该使用哪一个以及何时使用。
除此之外,如果我想转换weak_ptr
为shared_ptr
. 锁定weak_ptr
以创建shared_ptr
会影响我在其他线程中的代码吗?
c++ - 使用 shared_ptr 和 weak_ptr 时避免间接循环引用
我目前正在整理一个严重依赖的应用程序,shared_ptr
到目前为止一切看起来都很好——我已经完成了我的功课shared_ptr
,并且对使用s的一些陷阱有一个很好的了解。
最公认的问题之一shared_ptr
是循环依赖——这些问题可以通过存储weak_ptr
不影响链上对象生命周期的 s 来解决。但是,我正在努力解决需要通过 a 存储指向外部对象的指针的时间weak_ptr
-我不确定它是否被禁止、不鼓励或是否安全。
下图描述了我的意思(黑色箭头表示shared_ptr
;虚线表示weak_ptr
):
替代文字 http://img694.imageshack.us/img694/6628/sharedweakptr.png
- 父级包含
shared_ptr
s 到两个子级,这两个子级都使用 a 指向父级weak_ptr
。 - 在第一个孩子的构造函数中,我通过父级检索
weak_ptr
指向第二个孩子的指针并将其存储在本地。
代码如下所示:
我已经对此进行了测试,它似乎工作正常(我没有收到任何内存泄漏的报告),但是我的问题是:这安全吗?如果没有,为什么不呢?
c++ - weak_ptr 的性能损失是多少?
我目前正在为游戏设计一个对象结构,在我的例子中,最自然的组织变成了一棵树。作为智能指针的忠实粉丝,我shared_ptr
专门使用 's。但是,在这种情况下,树中的子节点将需要访问它的父节点(例如——地图上的生物需要能够访问地图数据——因此他们的父节点的数据。
拥有的方向当然是地图拥有它的存在,因此拥有指向它们的共享指针。然而,要从一个存在中访问地图数据,我们需要一个指向父级的指针——智能指针的方式是使用一个引用,ergo a weak_ptr
。
然而,我曾经读到锁定 aweak_ptr
是一项昂贵的操作——也许这不再是真的了——但考虑到weak_ptr
将经常被锁定,我担心这种设计注定会性能不佳。
因此问题是:
锁定weak_ptr 的性能损失是多少?它有多重要?
c++ - boost::weak_ptr 与自定义删除器的交互
我有一个boost::shared_ptr
附加的自定义删除器。将其转换weak_ptr
为删除器信息时是否丢失?如果是,我如何将相同的删除器重新附加到shared_ptr
从weak_ptr::lock()
方法获取的 -s ?
我正在实现的功能是一个weak_ptr
-s 容器,指向某种类型的活动实例。我需要自定义删除器来删除要删除的对象的容器条目。
c++ - 构造函数中指向 this 的弱指针
我知道无法通过从类的构造函数调用 shared_from_this() 来获得 shared_ptr,因为该对象尚未构造。但是,是否有可能从构造函数中获取对象的 weak_ptr ?一些讨论“weak_from_raw()”方法的 boost 论坛帖子表明它是可能的。
编辑:讨论weak_from_raw http://lists.boost.org/boost-users/2010/08/61541.php的Boost表单
c++11 - 为什么在 C++0x 中没有为 std::weak_ptr 定义 std::hash?
在阅读了关于 std::weak_ptr 的 operator< 的讨论之后,我看不出为什么定义 std::hash 以使用 std::weak_ptr 的控制块不起作用。我也不敢相信标准委员会忽略了这一点。有人阅读过有关该主题的相关讨论吗?
编辑:关于 std::weak_ptr http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1590.html的运算符<的讨论
boost - C++ boost::shared_ptr & boost::weak_ptr & dynamic_cast
我有这样的事情:
现在我想更改我的应用程序以使用 boost shared_ptr 和 weak_ptr 以便我可以在一个地方删除我的食物实例。它看起来像这样:
但问题是 dynamic_cast 似乎不适用于 weak_ptr
如果我知道它指向的对象是派生类型,我该如何weak_ptr<Fruit>
摆脱它?weak_ptr<Food>
c++ - shared_ptr 和 weak_ptr 的区别
我正在阅读 Scott Meyers 的“Effective C++”一书。有人提到有内置指针,它们tr1::shared_ptr
的tr1::weak_ptr
作用类似于内置指针,但它们会跟踪有多少tr1::shared_ptrs
指向一个对象。
这称为引用计数。这在防止非循环数据结构中的资源泄漏方面效果很好,但是如果两个或多个对象包含tr1::shared_ptrs
这样一个循环,则循环可能会使彼此的引用计数保持在零以上,即使指向循环的所有外部指针都已被破坏。
这就是tr1::weak_ptrs
进来的地方。
我的问题是循环数据结构如何使引用计数高于零。我请求一个示例 C++ 程序。问题是如何解决的weak_ptrs
?(再次,请举例)。