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源码的可读性并不那么好...
其实,weak_ptr的实现原理非常简单。当我们创建一个weak_ptr时,其内部会保存一个指向对象的裸指针,并且还会保存一个指向该对象的引用计数的指针。而这个引用计数指针则是由shared_ptr来维护的。 当我们通过weak_ptr的lock()方法将其转换为shared_ptr时,它会检查引用计数指针是否为空。如果为空,表示原来的shared_ptr...
编译错误,unique_ptr 不能被复制 的实现原理 是为了配合 shared_ptr 而引入的一种智能指针,它指向由 shared_ptr 管理的对象,但不影响对象的生命周期。通过 weak_ptr,我们可以解决 shared_ptr 的循环引用问题,避免内存泄漏。 通过shared_ptr 来创建,但不增加引用计数。当需要访问 weak_ptr 指向的对象时,可以通过 ...
和shared_ptr、unique_ptr 类型指针一样,weak_ptr 智能指针也是以模板类的方式实现的。weak_ptr<T>( T 为指针所指数据的类型)定义在<memory>头文件,并位于 std 命名空间中。因此,要想使用 weak_ptr 类型指针,程序中应首先包含<memory>头文件。 需要注意的是,C++11标准虽然将 weak_ptr 定位为智能指针的一种...
只能使用 My_shared_ptr 和 My_weak_ptr 对象来构造 My_weak_ptr对象。 My_weak_ptr对象的构造完成只能使_weaks的值加1 ; My_weak_ptr的生命期结束时,自动调用析构函数,析构函数中会调用计数器的My_Ref_count_base::_Decwref ()函数,weaks的引用计数减1,若_weaks计数为0,就会调用My_Ref_count_base:...
实现了一个简易的智能指针,并使用简单例子测试后,也没发现内存泄漏。 #include<iostream>#include<atomic>#define _CRTDBG_MAP_ALLOC#include<stdlib.h>#include<crtdbg.h>template<typenameT>classWeakPtr;template<typenameT>classSharedPtr;template<typenameT>classSharedPtr{public:friendclassWeakPtr<T>;friendvoid...
std::vector<std::weak_ptr<Observer>> observers_;};```3. 定义观察者类 定义一个观察者类,实...
一、独占型智能指针 scope_ptr 二、强 智能指针shared_ptr 三、弱 智能指针 weak_ptr 注:在本文中模拟的智能指针并不与库中的智能指针的实现完全相同,只是为了通过探究其实现原理而进行的一种模拟。 一、独占型智能指针 scope_ptr 在boost中有一种 scope_ptr 指针,可以说这是boost库中最为简单的一种智能指针...
1. 直接初始化:weak_ptr<T> wp(sp); //其中sp为shared_ptr类型 2. 赋值: wp1 = sp; //其中sp为shared_ptr类型 wp2 = wp1; //其中wp1为weak_ptr类型 (二)常用操作 1. use_count():获取当前控制块中资源的强引用计数。 2. expired():判断所观测的资源是否失效(即己经被释放),即use_count是否...