首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >shared_ptr和weak_ptr的区别

shared_ptr和weak_ptr的区别
EN

Stack Overflow用户
提问于 2011-02-13 21:26:29
回答 4查看 58.5K关注 0票数 81

我正在读斯科特·迈尔斯的"Effective C++“一书。有人提到,tr1::shared_ptrtr1::weak_ptr的作用类似于内置指针,但它们记录了有多少tr1::shared_ptrs指向一个对象。

这就是所谓的引用计数。这可以很好地防止非循环数据结构中的资源泄漏,但如果两个或更多对象包含tr1::shared_ptrs,从而形成一个循环,则该循环可能会使彼此的引用计数保持在零以上,即使指向该循环的所有外部指针都已被销毁。

这就是tr1::weak_ptrs的用武之地。

我的问题是循环数据结构是如何使引用计数超过零的。我亲切地请求一个示例C++程序。weak_ptrs是如何解决问题的?(同样,请举例说明)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-13 22:08:37

shared_ptr将引用计数机制包装在原始指针周围。因此,对于shared_ptr的每个实例,引用计数加1。如果两个share_ptr对象互相引用,它们将永远不会被删除,因为它们永远不会以引用计数为零结束。

weak_ptr指向一个shared_ptr,但不增加它的引用count.This意味着即使存在对它的weak_ptr引用,也仍然可以删除下面的对象。

其工作方式是,无论何时想要使用底层对象,都可以使用weak_ptr为创建shared_ptr。但是,如果该对象已被删除,则返回一个空的shared_ptr实例。由于基础对象上的引用计数不会随着weak_ptr引用而增加,因此循环引用不会导致基础对象不被删除。

票数 56
EN

Stack Overflow用户

发布于 2013-09-20 11:56:30

给未来的读者。

我只想指出,Atom给出的解释非常好,下面是工作代码

代码语言:javascript
运行
复制
#include <memory> // and others
using namespace std;

    class B; // forward declaration 
    // for clarity, add explicit destructor to see that they are not called
    class A { public: shared_ptr<B> b; ~A() {cout << "~A()" << endl; } };  
    class B { public: shared_ptr<A> a; ~B() {cout << "~B()" << endl; } };     
    shared_ptr<A> x(new A);  //x->b share_ptr is default initialized
    x->b = make_shared<B>(); // you can't do "= new B" on shared_ptr                      
    x->b->a = x;
    cout << x.use_count() << endl;  
票数 21
EN

Stack Overflow用户

发布于 2014-03-29 02:33:18

弱指针只是“观察”托管对象;它们不会“让它存活”,也不会影响它的生命周期。与shared_ptr不同,当最后一个weak_ptr超出作用域或消失时,指向的对象仍然可以存在,因为weak_ptr不会影响对象的生存期-它没有所有权。weak_ptr可用于确定对象是否存在,并提供可用于引用该对象的shared_ptr

weak_ptr的定义旨在使其相对简单,因此您几乎不能直接使用weak_ptr进行操作。例如,您不能取消引用它;operator*operator->都不是为weak_ptr定义的。你不能用它来访问指向对象的指针--没有get()函数。这里定义了一个比较函数,以便您可以将weak_ptrs存储在有序容器中,但仅此而已。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4984381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档