问题标签 [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.
c++ - Boost Shared Pointer:跨多个线程同时读取访问
我有一个线程 A 分配内存并将其分配给共享指针。然后这个线程产生 3 个其他线程 X、Y 和 Z,并将共享指针的副本传递给每个线程。当 X、Y 和 Z 超出范围时,内存被释放。但是是否有可能 2 个线程 X、Y 在完全相同的时间点超出范围,并且引用计数存在竞争条件,因此它不会减少 2,而是只减少一次。所以,现在更新的引用计数下降到 0,所以存在内存泄漏。请注意,X、Y 和 Z 只是读取内存。不写入或重置共享指针。长话短说,引用计数是否存在竞争条件,这会导致内存泄漏吗?
c++ - 返回 shared_ptr 时如何实现协变返回类型?
返回类型不是协变的(因此它们也不是合法的),但如果我使用原始指针,它们会是。解决这个问题的普遍接受的习语是什么,如果有的话?
c++ - 如何防止任何人窃取我的 shared_ptr?
因此,我将 boost::shared_ptr 用于它提供的所有各种引用计数优势——显然,对于初学者的引用计数,以及复制、分配和存储在 STL 容器中的能力。
问题是,如果我将它传递给一个“恶意”函数或对象,则该对象可以保存 ptr,然后如果没有外部函数或对象很好地放弃其所有权,我将永远无法取消分配它。
最终,我尝试保持明确的对象所有权。我通过让所有者将唯一的 shared_ptr 保留给对象来实现这一点,而“guest”对象只将 weak_ptr 存储到对象中。
我真的不想要shared_ptr 的“共享”部分,但我需要使用shared_ptr 来制作weak_ptr。我想使用 scoped_ptr,但它非常有限,因为你不能复制它。您不能将其存储在容器中,不能从中借出weak_ptrs,也不能将所有权转让给新经理。
解决方案是什么?
c++ - 使用 shared_ptrs 时返回引用
假设我有一个相当大的 class Matrix
,并且我已经重载operator==
以检查相等性,如下所示:
当然,我通过引用传递 Matrix 对象,因为它们太大了。
现在我有一个方法Matrix::inverse()
可以返回一个新的 Matrix 对象。现在我想在比较中直接使用逆,如下所示:
问题是,这意味着逆向方法需要返回对 Matrix 对象的引用。两个问题:
由于我只是在此一次比较中使用该引用,这是内存泄漏吗?
如果 inverse() 方法中要返回的对象属于 boost::shared_ptr 会发生什么?方法一退出,shared_ptr 就被销毁,对象不再有效。有没有办法返回对属于 shared_ptr 的对象的引用?
c++ - 你对 typedef'ing shared_ptr 的约定是什么?
我typedef
在boost::shared_ptr
模板的命名约定之间来回切换。例如:
在确定约定之前,我想看看其他人使用什么。你的约定是什么?
编辑:
对于那些嵌套在typedef
里面的人来说,现在“意识到”它将如何被传递,Foo
你不会感到困扰吗?Foo
它似乎打破了封装。这个怎么样:
你现在不会这样做,对吗?:-)
c++ - 使用 shared_ptr 的内存泄漏
这两个代码示例都可以毫无问题地编译和运行。使用第二种变体会导致内存泄漏。任何想法为什么?提前感谢您的帮助。
变体 1:
变体 2:
c++ - 是否有任何与 boost/tr1 shared_ptr 无关的版本
我正在寻找 boost/ tr1shared_ptr
和.weak_ptr
enable_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 个文件......
c++ - 如何将 boost::shared_ptr (或另一个智能指针)附加到对象父级的引用计数器?
我记得以前遇到过这个概念,但现在在谷歌上找不到。
如果我有一个 A 类型的对象,它直接嵌入了 B 类型的对象:
我怎样才能有一个智能指针B
,例如boost::shared_ptr<B>
,但使用引用计数A
?假设它自己的一个实例A
是堆分配的,我可以安全地使用enable_shared_from_this
.
c++ - 投射 shared_ptr 的容器
我有一个方法
我试图用两种不同类型的列表来调用它,一种是 DerivedClass1,一种是 DerivedClass2
然而,这显然会产生编译器错误
有没有简单的方法来投射 shared_ptr 的容器?可以做到这一点的替代容器?
更新:感谢所有回复的人。在语言的范围内工作,保持方法“原样”的最佳方法似乎是使用 shared_ptr 的容器并将其准确传递(在调用站点创建一个新列表)。
我想我几乎已经知道这一点,但我记得阅读过关于处理 shared_ptr 容器的 boost 库的其他部分,并认为它可能已经被其他人更优雅地解决了。然而,从我自己的进一步研究来看,这些似乎更倾向于减少 shared_ptr 的开销,在一些指针被独占拥有的情况下(因此需要每个容器一个锁,而不是容器中的每个对象一个锁)。
再次感谢你们,你们都很棒!
c++ - shared_ptr 作为类成员
通常将包含的对象声明为指向该类的指针,同时在头文件中“前向声明”它们。这是为了减少代码中的物理依赖性。
例如
将这样的成员声明为 shared_ptr 而不是裸指针是个好主意吗?
我更喜欢 scoped_ptr,但 AFAIK 它不会是标准的。