问题标签 [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.

0 投票
5 回答
964 浏览

c++ - 在库接口中提供对 weak_ptr 的访问是否明智?

我编写了一个库,它公开了对几种相关对象类型的引用。所有这些对象的生命周期都由库内部通过boost::shared_ptr

库的用户还可以根据库的性质知道任何暴露对象的生命周期。所以他们可以存储指针或保留对这些对象的引用。他们这样做并知道这些对象何时不再有效是合理的。

但我对强迫我的用户讲道理感到内疚。

weak_ptr让库公开其对象是否可以接受?其他图书馆有这样做过吗?

我已经分析了这个库在应用程序中的使用情况,发现它对任务至关重要,无法weak_ptr专门公开。

让匹配的 API 函数公开引用weak_ptr 或让任何对象能够将 a 公开weak_ptr给自身会更明智吗?

0 投票
2 回答
964 浏览

c++ - shared_ptr、订阅、析构函数

我在整个应用程序中使用 Boost/shared_ptr 指针。当对对象的最后一个引用被释放时,shared_ptr 将为我删除该对象。应用程序中的对象订阅应用程序中心位置的事件,类似于观察者/订阅者模式。

在对象析构函数中,对象将从订阅列表中取消订阅。订阅列表本质上只是一个list<weak_ptr<MyObject> >. 我想做的是与此类似的事情:

我的问题是不能在析构函数中调用 shared_from_this ,所以上面的代码会抛出异常。

在我的旧实现中,订阅列表只是一个指针列表,然后它就起作用了。但我想改用weak_ptr 引用来降低我通过手动内存管理搞砸内存的风险。

由于我依赖 shared_ptr 来执行对象删除,因此我的代码中没有一个地方可以逻辑地调用 Unsubscribe。

关于在这种情况下该怎么做的任何想法?

0 投票
4 回答
23664 浏览

c++ - 提升,共享ptr与弱ptr?什么时候用?

在我目前的项目中,我使用boost::shared_ptr得相当广泛。

最近我的队友也开始使用weak_ptr. 我不知道该使用哪一个以及何时使用。

除此之外,如果我想转换weak_ptrshared_ptr. 锁定weak_ptr以创建shared_ptr会影响我在其他线程中的代码吗?

0 投票
3 回答
4065 浏览

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_ptrs 到两个子级,这两个子级都使用 a 指向父级weak_ptr
  • 在第一个孩子的构造函数中,我通过父级检索weak_ptr指向第二个孩子的指针并将其存储在本地。

代码如下所示:

我已经对此进行了测试,它似乎工作正常(我没有收到任何内存泄漏的报告),但是我的问题是:这安全吗?如果没有,为什么不呢?

0 投票
3 回答
10881 浏览

c++ - weak_ptr 的性能损失是多少?

我目前正在为游戏设计一个对象结构,在我的例子中,最自然的组织变成了一棵树。作为智能指针的忠实粉丝,我shared_ptr专门使用 's。但是,在这种情况下,树中的子节点将需要访问它的父节点(例如——地图上的生物需要能够访问地图数据——因此他们的父节点的数据。

拥有的方向当然是地图拥有它的存在,因此拥有指向它们的共享指针。然而,要从一个存在中访问地图数据,我们需要一个指向父级的指针——智能指针的方式是使用一个引用,ergo a weak_ptr

然而,我曾经读到锁定 aweak_ptr是一项昂贵的操作——也许这不再是真的了——但考虑到weak_ptr将经常被锁定,我担心这种设计注定会性能不佳。

因此问题是:

锁定weak_ptr 的性能损失是多少?它有多重要?

0 投票
1 回答
711 浏览

c++ - boost::weak_ptr 与自定义删除器的交互

我有一个boost::shared_ptr附加的自定义删除器。将其转换weak_ptr为删除器信息时是否丢失?如果是,我如何将相同的删除器重新附加到shared_ptrweak_ptr::lock()方法获取的 -s ?

我正在实现的功能是一个weak_ptr-s 容器,指向某种类型的活动实例。我需要自定义删除器来删除要删除的对象的容器条目。

0 投票
2 回答
5071 浏览

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表单

0 投票
2 回答
875 浏览

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的运算符<的讨论

0 投票
3 回答
3463 浏览

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>

0 投票
5 回答
59955 浏览

c++ - shared_ptr 和 weak_ptr 的区别

我正在阅读 Scott Meyers 的“Effective C++”一书。有人提到有内置指针,它们tr1::shared_ptrtr1::weak_ptr作用类似于内置指针,但它们会跟踪有多少tr1::shared_ptrs指向一个对象。

这称为引用计数。这在防止非循环数据结构中的资源泄漏方面效果很好,但是如果两个或多个对象包含tr1::shared_ptrs这样一个循环,则循环可能会使彼此的引用计数保持在零以上,即使指向循环的所有外部指针都已被破坏。

这就是tr1::weak_ptrs进来的地方。

我的问题是循环数据结构如何使引用计数高于零。我请求一个示例 C++ 程序。问题是如何解决的weak_ptrs?(再次,请举例)。