问题标签 [shared-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 回答
1029 浏览

c++ - Boost Shared Pointer:跨多个线程同时读取访问

我有一个线程 A 分配内存并将其分配给共享指针。然后这个线程产生 3 个其他线程 X、Y 和 Z,并将共享指针的副本传递给每个线程。当 X、Y 和 Z 超出范围时,内存被释放。但是是否有可能 2 个线程 X、Y 在完全相同的时间点超出范围,并且引用计数存在竞争条件,因此它不会减少 2,而是只减少一次。所以,现在更新的引用计数下降到 0,所以存在内存泄漏。请注意,X、Y 和 Z 只是读取内存。不写入或重置共享指针。长话短说,引用计数是否存在竞争条件,这会导致内存泄漏吗?

0 投票
3 回答
2520 浏览

c++ - 返回 shared_ptr 时如何实现协变返回类型?

返回类型不是协变的(因此它们也不是合法的),但如果我使用原始指针,它们会是。解决这个问题的普遍接受的习语是什么,如果有的话?

0 投票
6 回答
970 浏览

c++ - 如何防止任何人窃取我的 shared_ptr?

因此,我将 boost::shared_ptr 用于它提供的所有各种引用计数优势——显然,对于初学者的引用计数,以及复制、分配和存储在 STL 容器中的能力。

问题是,如果我将它传递给一个“恶意”函数或对象,则该对象可以保存 ptr,然后如果没有外部函数或对象很好地放弃其所有权,我将永远无法取消分配它。

最终,我尝试保持明确的对象所有权。我通过让所有者将唯一的 shared_ptr 保留给对象来实现这一点,而“guest”对象只将 weak_ptr 存储到对象中。

我真的不想要shared_ptr 的“共享”部分,但我需要使用shared_ptr 来制作weak_ptr。我想使用 scoped_ptr,但它非常有限,因为你不能复制它。您不能将其存储在容器中,不能从中借出weak_ptrs,也不能将所有权转让给新经理。

解决方案是什么?

0 投票
1 回答
413 浏览

c++ - 使用 shared_ptrs 时返回引用

假设我有一个相当大的 class Matrix,并且我已经重载operator==以检查相等性,如下所示:

当然,我通过引用传递 Matrix 对象,因为它们太大了。

现在我有一个方法Matrix::inverse()可以返回一个新的 Matrix 对象。现在我想在比较中直接使用逆,如下所示:

问题是,这意味着逆向方法需要返回对 Matrix 对象的引用。两个问题:

  1. 由于我只是在此一次比较中使用该引用,这是内存泄漏吗?

  2. 如果 inverse() 方法中要返回的对象属于 boost::shared_ptr 会发生什么?方法一退出,shared_ptr 就被销毁,对象不再有效。有没有办法返回对属于 shared_ptr 的对象的引用?

0 投票
16 回答
25624 浏览

c++ - 你对 typedef'ing shared_ptr 的约定是什么?

typedefboost::shared_ptr模板的命名约定之间来回切换。例如:

在确定约定之前,我想看看其他人使用什么。你的约定是什么?

编辑:

对于那些嵌套在typedef里面的人来说,现在“意识到”它将如何被传递,Foo你不会感到困扰吗?Foo它似乎打破了封装。这个怎么样:

你现在不会这样做,对吗?:-)

0 投票
4 回答
5051 浏览

c++ - 使用 shared_ptr 的内存泄漏

这两个代码示例都可以毫无问题地编译和运行。使用第二种变体会导致内存泄漏。任何想法为什么?提前感谢您的帮助。

变体 1:

变体 2:

0 投票
3 回答
430 浏览

c++ - 是否有任何与 boost/tr1 shared_ptr 无关的版本

我正在寻找 boost/ tr1shared_ptr和.weak_ptrenable_shared_from_this

我需要:

  • Boost 这些特性的独立非常小的实现。
  • 我只需要支持现代编译器,如 GCC-4.x、MSVC-2008、英特尔,而不是 MSVC6 或 gcc-3.3
  • 我需要它在非 copyleft LGPL 兼容许可下获得许可,如 Boost/Mit/3-clause BSD。

所以我可以将它包含在我的库中。

注意 - 从 boost 中提取 shared_ptr 非常困难,至少 BCP 提供了大约 324 个文件......

0 投票
2 回答
1270 浏览

c++ - 如何将 boost::shared_ptr (或另一个智能指针)附加到对象父级的引用计数器?

我记得以前遇到过这个概念,但现在在谷歌上找不到。

如果我有一个 A 类型的对象,它直接嵌入了 B 类型的对象:

我怎样才能有一个智能指针B,例如boost::shared_ptr<B>,但使用引用计数A?假设它自己的一个实例A是堆分配的,我可以安全地使用enable_shared_from_this.

0 投票
4 回答
3009 浏览

c++ - 投射 shared_ptr 的容器

我有一个方法

我试图用两种不同类型的列表来调用它,一种是 DerivedClass1,一种是 DerivedClass2

然而,这显然会产生编译器错误

有没有简单的方法来投射 shared_ptr 的容器?可以做到这一点的替代容器?

更新:感谢所有回复的人。在语言的范围内工作,保持方法“原样”的最佳方法似乎是使用 shared_ptr 的容器并将其准确传递(在调用站点创建一个新列表)。

我想我几乎已经知道这一点,但我记得阅读过关于处理 shared_ptr 容器的 boost 库的其他部分,并认为它可能已经被其他人更优雅地解决了。然而,从我自己的进一步研究来看,这些似乎更倾向于减少 shared_ptr 的开销,在一些指针被独占拥有的情况下(因此需要每个容器一个锁,而不是容器中的每个对象一个锁)。

再次感谢你们,你们都很棒!

0 投票
4 回答
9167 浏览

c++ - shared_ptr 作为类成员

通常将包含的对象声明为指向该类的指针,同时在头文件中“前向声明”它们。这是为了减少代码中的物理依赖性。

例如

将这样的成员声明为 shared_ptr 而不是裸指针是个好主意吗?

我更喜欢 scoped_ptr,但 AFAIK 它不会是标准的。