weak_ptr 实现 1. weak_ptr的基本概念 weak_ptr 是C++11 引入的一种智能指针,用于解决 shared_ptr 可能导致的循环引用问题。weak_ptr 不拥有其所指向的对象,也就是说,它不会影响对象的引用计数。它更像是一个对 shared_ptr 所管理对象的弱引用。
1. shared_ptr的实现 2. weak_ptr的实现 3. enable_shared_from_this的实现 这个版本的智能指针是我去看了本机上GNU C++标准库中shared_ptr源码后写的,在我的ubuntu22.04上,源码位置在/usr/include/c++/12/bits/shared_ptr_base.h和/usr/include/c++/12/bits/shared_ptr.h下。GNU源码的可读性并不那么好...
是为了配合 shared_ptr 而引入的一种智能指针,它指向由 shared_ptr 管理的对象,但不影响对象的生命周期。通过 weak_ptr,我们可以解决 shared_ptr 的循环引用问题,避免内存泄漏。 通过shared_ptr 来创建,但不增加引用计数。当需要访问 weak_ptr 指向的对象时,可以通过 lock() 方法转换为 shared_ptr,如果转换成功,...
noexcept{returnblock_->weak_count.load();}private:structControlBlock{std::atomic<std::int64_t>count;std::atomic<std::int64_t>weak_count;T*ptr;};voidrelease()noexcept{block_->count.fetch_sub(1);if(block_->count<=0){if(block_->ptr){deleteblock_->ptr;block_->ptr=nullptr;}if(block_...
weak_ptr概念 My_weak_ptr是一个模板派生类,My_Ptr_base是它的基类 My_weak_ptr模板类没有自己的数据成员,而是只提供了一些供调用的接口; 只能使用 My_shared_ptr 和 My_weak_ptr 对象来构造 My_weak_ptr对象。 My_weak_ptr对象的构造完成只能使_weaks的值加1 ; ...
在理解weak_ptr的实现原理之前,我们首先来回顾一下shared_ptr的工作原理。 shared_ptr是一种引用计数智能指针,它通过记录有多少个shared_ptr指向同一个对象来判断该对象是否可以被释放。每当一个shared_ptr被创建时,引用计数加1;当一个shared_ptr被销毁时,引用计数减1。当引用计数为0时,表示没有任何shared_ptr...
同时,weak_ptr<T> 模板类中没有重载 * 和 -> 运算符,这也就意味着,weak_ptr 类型指针只能访问所指的堆内存,而无法修改它。 一、weak_ptr的作用 weak_ptr主要针对shared_ptr的空悬指针和循环引用问题而提出: (1)空悬指针问题:有两个指针p1和p2,指向堆上的同一个对象Object,p1和p2位于不同的线程中。假设...
在notifyObservers方法中,遍历观察者列表时,需要使用weak_ptr的lock方法来获取观察者的shared_ptr,如果...
一、std::shared_ptr的循环引用1. 概念2. 示例分析 二、std::weak_ptr1. 简介2. weak_ptr模板类提供的成员方法3. 使用示例(1)weak_ptr指针的创建(2)完整示例(解决上面循环引用问题) 4. C++模拟实现 温馨提示 引言 欢迎阅读本系列文章的第二篇,我们将继续探讨与shared_ptr相关的主题。上一篇文章我们介绍...
先看类图。从类图中可以看到,weak_ptr的结构与shared_ptr几乎一样,都是两个指针。 源码中两个指针的定义: shared_ptr_base.h 下面我们看几个“关键状态”。 1 - weak引用计数增加 与shared_ptr过程类似,只是操作的变量为_M_weak_count。 2 - weak引用计数减少 同样,与shared_ptr过程类似,只是操作的变量为_...