我正在读斯科特·迈尔斯的"Effective C++“一书。有人提到,tr1::shared_ptr
和tr1::weak_ptr
的作用类似于内置指针,但它们记录了有多少tr1::shared_ptrs
指向一个对象。
这就是所谓的引用计数。这可以很好地防止非循环数据结构中的资源泄漏,但如果两个或更多对象包含tr1::shared_ptrs
,从而形成一个循环,则该循环可能会使彼此的引用计数保持在零以上,即使指向该循环的所有外部指针都已被销毁。
这就是tr1::weak_ptrs
的用武之地。
我的问题是循环数据结构是如何使引用计数超过零的。我亲切地请求一个示例C++程序。weak_ptrs
是如何解决问题的?(同样,请举例说明)。
发布于 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
引用而增加,因此循环引用不会导致基础对象不被删除。
发布于 2013-09-20 11:56:30
给未来的读者。
我只想指出,Atom给出的解释非常好,下面是工作代码
#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;
发布于 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
存储在有序容器中,但仅此而已。
https://stackoverflow.com/questions/4984381
复制相似问题