Questions tagged «shared-ptr»

引用计数的实现共享所有权的智能指针类


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的“基础知识”演讲。

5
将共享指针作为参数传递
如果我声明一个包装在共享指针中的对象: std::shared_ptr&lt;myClass&gt; myClassObject(new myClass()); 然后我想将其作为方法的参数传递: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr&lt;myClass&gt; arg1) { arg1-&gt;someField = 4; } 上面是否只是简单地增加了shared_pt的引用计数,并且一切都很酷?还是留下一个悬空的指针? 您仍然应该这样做吗?: DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr&lt;myClass&gt;* arg1) { (*arg1)-&gt;someField = 4; } 我认为第二种方法可能更有效,因为它只需要复制1个地址(而不是整个智能指针),但是第一种方法似乎更具可读性,并且我预计不会出现性能限制。我只想确保它没有危险。 谢谢。

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 } …

2
在C ++中,空std :: shared_ptr和空std :: shared_ptr有什么区别?
该cplusplus.comshared_ptr页面召唤出一个区分空 std::shared_ptr和空 shared_ptr。该cppreference.com页面没有明确叫出区别,但同时使用“空”,并比较nullptr其描述std::shared_ptr行为。 空和空值之间有区别shared_ptr吗?这种混合行为指针有什么用例?非空nullshared_ptr甚至有意义吗?在正常使用情况下(如果您没有显式构造一个)会出现一个空但非空的情况shared_ptr吗? 如果您使用的是Boost版本而不是C ++ 11版本,这些答案是否会改变?
80 c++  c++11  shared-ptr 

5
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?(再次,请举个例子)。

3
如何向下转换std :: shared_ptr?
考虑: struct SomethingThatsABase { virtual bool IsChildOne() const { return false; } virtual bool IsChildTwo() const { return false; } }; struct ChildOne : public SomethingThatsABase { virtual bool IsChildOne() const { return true; } }; struct ChildTwo : public SomethingThatsABase { virtual bool IsChildTwo() const { return true; } …

4
使用boost :: shared_ptr进行static_cast?
static_cast与with等效boost::shared_ptr吗? 换句话说,我该如何重写以下内容 Base* b = new Derived(); Derived* d = static_cast&lt;Derived*&gt;(b); 什么时候使用shared_ptr? boost::shared_ptr&lt;Base&gt; b(new Derived()); boost::shared_ptr&lt;Derived&gt; d = ???

2
为什么shared_ptr仅使用一个时,unique_ptr会使用两个模板参数?
双方unique_ptr并shared_ptr接受定制的析构函数他们所拥有的对象上调用。但在的情况下unique_ptr,析构函数作为一个模板参数传递类,而类型shared_ptr的自定义析构函数将被指定为一个模板参数的构造函数。 template &lt;class T, class D = default_delete&lt;T&gt;&gt; class unique_ptr { unique_ptr(T*, D&amp;); //simplified ... }; 和 template&lt;class T&gt; class shared_ptr { template&lt;typename D&gt; shared_ptr(T*, D); //simplified ... }; 我不明白为什么会有这样的差异。有什么要求?

8
我应该从使用boost :: shared_ptr切换到std :: shared_ptr吗?
我想在中启用GCC中对C ++ 0x的支持-std=c++0x。在GCC 4.5(以及不久的4.6)中,我并不一定需要任何当前受支持的C ++ 11功能,但是我想开始习惯它们。例如,在一些我使用迭代器的地方,一种auto类型会很有用。 但是同样,我不需要任何当前支持的功能。目的是鼓励我将新标准的功能纳入我的编程“词汇表”中。 从对C ++ 11支持的了解来看,在GCC中启用它,然后例如通过boost::shared_ptr将使用从切换为std::shared_ptr单独使用,而不是两者混合使用,将其包含进来,是一个好主意吗? PS:我知道这个比较不同口味的好问题,shared_ptr但我想在标准定稿之前就使用哪种更高层次的建议提出建议。换句话说,当像GCC这样的编译器说它支持“实验功能”时,是否意味着我很可能在编译期间遇到奇怪的错误,而这将是主要的时间消耗,并且是StackOverflow上的一些神秘问题的来源? 编辑:我std::shared_ptr之所以决定从此退回,因为我不信任它在GCC 4.5中的支持,如本问题中的例子所示。
69 c++  boost  stl  c++11  shared-ptr 


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.