Questions tagged «smart-pointers»

一种抽象的数据类型,它在提供其他功能(例如自动垃圾收集或边界检查)的同时模拟指针


2
如何通过引用或值返回智能指针(shared_ptr)?
假设我有一个带有返回a的方法的类shared_ptr。 通过引用或按值退还它可能有什么利弊? 两种可能的线索: 早期物体破坏。如果我返回shared_ptrby(const)引用,则引用计数器不会增加,因此当对象超出另一个上下文(例如,另一个线程)的范围时,我将承担删除该对象的风险。这样对吗?如果环境是单线程的,该情况也会发生吗? 成本。价值传递当然不是免费的。是否有可能在任何可能的情况下避免它? 谢谢大家。

4
将shared_ptr <Derived>作为shared_ptr <Base>传递
将shared_ptr派生类型的a传递给采用shared_ptr基本类型的a的函数的最佳方法是什么? 通常,我shared_ptr通过引用传递s以避免不必要的复制: int foo(const shared_ptr&lt;bar&gt;&amp; ptr); 但是如果我尝试做类似的事情这是行不通的 int foo(const shared_ptr&lt;Base&gt;&amp; ptr); ... shared_ptr&lt;Derived&gt; bar = make_shared&lt;Derived&gt;(); foo(bar); 我可以用 foo(dynamic_pointer_cast&lt;Base, Derived&gt;(bar)); 但这似乎不太理想,原因有两个: 一个dynamic_cast似乎有点过度了一个简单的衍生到基础施法。 据我了解,dynamic_pointer_cast创建指针的副本(尽管是临时的)以传递给函数。 有更好的解决方案吗? 后代更新: 原来是缺少头文件的问题。另外,我在这里尝试执行的操作也被视为反模式。通常, 不影响对象生命周期的函数(即对象在函数持续时间内保持有效)应采用简单的引用或指针,例如int foo(bar&amp; b)。 占用对象的函数(即给定对象的最终用户)应采用unique_ptr按值,例如int foo(unique_ptr&lt;bar&gt; b)。std::move调用者应将值放入函数中。 延长对象寿命的函数应采用shared_ptr按值,例如int foo(shared_ptr&lt;bar&gt; b)。避免循环引用的通常建议适用。 有关详细信息,请参见Herb Sutter的“基础知识”演讲。


3
shared_ptr魔术:)
利德斯特罗姆先生和我有一个论点:) Lidström先生的主张是,构造shared_ptr&lt;Base&gt; p(new Derived);不需要Base具有虚拟析构函数: Armen Tsirunyan:“真的吗?shared_ptr会正确清理吗?在这种情况下,请您演示一下如何实现这种效果?” DanielLidström:“ shared_ptr使用其自己的析构函数来删除Concrete实例。在C ++社区中被称为RAII。我的建议是,您将学习到有关RAII的全部知识。它将使您使用C ++的代码如此容易在任何情况下都可以使用RAII。” Armen Tsirunyan:“我了解RAII,而且我也知道,最终pn达到0时,shared_ptr析构函数可能会删除存储的px。但是,如果px具有指向的静态类型指针Base和动态类型的指针Derived,则除非Base具有虚拟析构函数,否则会导致不确定的行为。如果我做错了,请纠正我。” DanielLidström:“ shared_ptr知道静态类型是Concrete。自从我在其构造函数中传递它以来,它就知道这一点!看起来有点像魔术,但是我可以向您保证,它是设计使然,非常好。” 所以,判断我们。在不要求多态类具有虚拟析构函数的情况下,如何(如果可能)实现shared_ptr?提前致谢

5
std :: shared_ptr是否具有非原子等效项?为什么<memory>中没有一个?
这是一个由两部分组成的问题,全部有关std::shared_ptr: 1. 据我所知,std::shared_ptr是唯一的智能指针在&lt;memory&gt;这原子。我想知道是否有std::shared_ptr可用的非原子版本(我在中看不到任何内容&lt;memory&gt;,所以我也愿意接受标准之外的建议,例如Boost中的建议)。我知道boost::shared_ptr也是原子的(如果BOOST_SP_DISABLE_THREADS未定义),但是也许还有另一种选择?我正在寻找具有与相同语义std::shared_ptr但没有原子性的东西。 2.我理解为什么std::shared_ptr是原子的;很好。但是,这并不是在每种情况下都很好,并且C ++历来有“只为所用内容付费”的口号。如果我不使用多个线程,或者如果我使用多个线程但不跨线程共享指针所有权,那么原子智能指针就显得过分了。我的第二个问题是,为什么std::shared_ptrC ++ 11中没有提供非原子版本的?(假设有一个原因)(如果答案仅仅是“根本就没有考虑过非原子版本”或“没有人问过非原子版本”就可以了!)。 对于问题2,我想知道是否有人提出了非原子版本的shared_ptr(向Boost或标准委员会提出)(不是取代原子版本的shared_ptr,而是与之共存)而被否决了。具体原因。

7
使用shared_ptr的例子?
嗨,我今天问一个问题,关于如何在同一向量数组中插入不同类型的对象,我在该问题中的代码是 gate* G[1000]; G[0] = new ANDgate() ; G[1] = new ORgate; //gate is a class inherited by ANDgate and ORgate classes class gate { ..... ...... virtual void Run() { //A virtual function } }; class ANDgate :public gate {..... ....... void Run() { //AND version of Run } …


10
什么时候使用shared_ptr和什么时候使用原始指针?
class B; class A { public: A () : m_b(new B()) { } shared_ptr&lt;B&gt; GimmeB () { return m_b; } private: shared_ptr&lt;B&gt; m_b; }; 假设B是一个在语义上不应存在于A生存期之外的类,即,对于B本身存在绝对是没有意义的。应该GimmeB返回ashared_ptr&lt;B&gt;或a B*? 通常,是否最好完全避免在C ++代码中使用原始指针来代替智能指针? 我认为,shared_ptr仅在显式转让或所有权共享时才应使用,在函数分配一些内存,用一些数据填充并返回它的情况下,我认为这种情况很少见,并且理解在呼叫者和被呼叫者之间,前者现在对该数据“负责”。

12
RAII与垃圾收集器
我最近在CppCon 2016上观看了Herb Sutter关于“ Leak Free C ++ ...”的精彩演讲,他在演讲中谈到了使用智能指针实现RAII(资源获取是初始化)-概念以及它们如何解决大多数内存泄漏问题。 现在我在想。如果我严格遵守RAII规则,这似乎是一件好事,那为什么与C ++中的垃圾收集器有什么不同呢?我知道,使用RAII,程序员可以完全控制何时再次释放资源,但是在任何情况下,仅使用垃圾收集器都是有好处的吗?效率会降低吗?我什至听说有一个垃圾收集器可以提高效率,因为它可以一次释放更大的内存块,而不是在整个代码中释放小的内存块。

2
我应该分配或重置unique_ptr吗?
在通常情况下,拥有对象的生命周期与其拥有者相关联,我可以使用2种方法之一的唯一指针。。 可以分配: class owner { std::unique_ptr&lt;someObject&gt; owned; public: owner() { owned=std::unique_ptr&lt;someObject&gt;(new someObject()); } }; 可以使用reset方法: class owner { std::unique_ptr&lt;someObject&gt; owned; public: owner() { owned.reset(new someObject()); } }; 为了最佳实践,我是否应该优先选择一种形式? 编辑:对不起人们。我过度简化了这一点。堆分配以初始化方法而不是ctor进行。因此,我不能使用初始化程序列表。

7
如何将协变返回类型与智能指针一起使用?
我有这样的代码: class RetInterface {...} class Ret1: public RetInterface {...} class AInterface { public: virtual boost::shared_ptr&lt;RetInterface&gt; get_r() const = 0; ... }; class A1: public AInterface { public: boost::shared_ptr&lt;Ret1&gt; get_r() const {...} ... }; 此代码无法编译。 在Visual Studio中,它引发了 C2555:覆盖虚拟函数的返回类型不同并且不是协变的 如果我不使用boost::shared_ptr而是返回原始指针,则代码会编译(我理解这是由于C ++中的协变返回类型所致)。我可以看到这个问题是因为boost::shared_ptr的Ret1不是源自boost::shared_ptr的RetInterface。但是我想返回boost::shared_ptrofRet1以用于其他类,否则我必须在返回之后强制转换返回的值。 难道我做错了什么? 如果不是,为什么这样的语言-在这种情况下,应该可以扩展以处理智能指针之间的转换?有理想的解决方法吗?

2
weak_ptr重置会影响shared_ptr吗?
我不习惯使用它weak_ptr,我正面临一个令人困惑的情况。我正在将Intel XE 2019 Composer更新5(程序包2019.5.281)与Visual Studio 2019版本结合使用。16.2.5。我用64位编译。我使用标准的C ++ 17。 这是我的秒杀解决方案的代码: #include &lt;memory&gt; #include &lt;iostream&gt; using namespace std; int main( int argc, char* argv[] ) { shared_ptr&lt;int&gt; sp = make_shared&lt;int&gt;( 42 ); cout &lt;&lt; "*sp = " &lt;&lt; *sp &lt;&lt; endl; weak_ptr&lt;int&gt; wp = sp; cout &lt;&lt; "*sp = " &lt;&lt; *sp …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.