从_M_release可以看出,智能指针所接管的指针的释放内存工作只和_M_use_count有关,当_M_use_count减完时就会将其释放了,而_M_weak_count也是有作用的,他负责释放_Sp_counted_base本身,这也就是为什么weak_ptr可以保证智能指针这个对象有效,但不保证智能指针所引用的指针有效的原因了(这点和shared_ptr、weak_ptr...
同时我们有了一个新的type叫做waek_ptr<T>用来表示对应元素的weak_ptr的类型 字段 其中有两个字段,分别是指向对象的指针element_type* __ptr_和 指向控制块的指针__shared_weak_count* __cntrl_其继承于__shared_count __ptr_ 这个字段就是指向原本指向的对象 __shared_weak_count 这个字段则指向控制块,其中...
这是我们使用弱指针(weak_ptr)的原因,因为它们不是引用计数。 所以,weak_ptr被声明的类没有很强的保持,即所有权不被共享,但是他们可以访问这些对象。 所以,在shared_ptr的情况下,由于循环依赖关系use_count从不达到零,这是阻止使用weak_ptr的,通过将A_ptr声明为weak_ptr来消除这个问题,因此A类不拥有它,只能访问...
既然weak_ptr无法直接使用资源,那他设计_M_ptr这个成员的意图在哪里呢?答案就是lock方法将weak_ptr转换为shared_ptr时是需要将这个指针传递过去的,不然连接管的指针都没了转换的意义也就没了 析构函数啥也没做,因为weak_ptr不持有资源,不对资源的释放产生影响,接下来对__weak_count进行分析4.2...
“智能指针”指shared_ptr或weak_ptr “裸指针”指原始的C指针 裸指针还是智能指针通常是上下文自明的,此时直接用“指针”一词指代两者之一 首先,我们来看shared_ptr和weak_ptr持有了哪些数据。 对于shared_ptr和weak_ptr,都仅持有两个字段,指向对象地址的指针ptr,和指向计数器对象的指针rep。
shared_ptr的用法 从名字上看shared_ptr是共享指针,意味着我们可以复制shared_ptr,复制出的智能指针指向同一个内部数据指针(即被智能指针包装的真正数据)。 构造shared_ptr 有多种方法可以构造shared_ptr,下面代码中有4种构造方式: int *p = new int(1); ...
std::weak_ptr:弱引用的智能指针,它不共享指针,不能操作资源,是用来监视 shared_ptr 的。 2.基本使用方法 弱引用智能指针 std::weak_ptr 可以看做是 shared_ptr 的助手,它不管理 shared_ptr 内部的指针。 std::weak_ptr 没有重载操作符 * 和 ->,因为它不共享指针,不能操作资源,所以它的构造不会增加引...
weak_ptr相比之下,weak_ptr更加简单,它不直接控制对象,仅作为shared_ptr的弱引用。使用weak_ptr时,它不会改变shared_ptr的引用计数。weak_ptr的典型操作有reset()、use_count()、expired()和lock(),它们在弱引用管理上各有特色。应用示例weak_ptr有助于避免循环引用导致的内存问题,以及在缓存和...
答案是:在需要访问资源的时候 weak_ptr 为你生成一个 shared_ptr, shared_ptr 能够保证在 shared_ptr 没有被释放之前,其所管理的资源 是不会被释放的。创建 shared_ptr 的方法就是 lock()方法。 细节:shared_ptr 实现了 operator bool() const 方法来判断一个 管理的资源是否被释放。
将成员pre_ 或 next_改为:weak_ptr类型即可:class WeakNode{public:int data_;// 2个成员 一个改为 weak_ptr即可解决循环引用std::weak_ptr<WeakNode> pre_;std::shared_ptr<WeakNode> next_;~WeakNode(){std::cout << "destruct..." << std::endl;}}; ...