智能指针的简单实现-SharePtr

【C++】share_ptr详解 分析:根据对象生成顺序,先初始化基类 enable_shared_from_this ,再初始化派生类 Frame 对象本身,这时 Frame 对象已经生成,但 _M_weak_this 成员还未被初始化,最后应通过 shared_ptr<T> sp(new T()) 等方式调用 shared_ptr 构造函数(内部会调用 _M_weak_assign 成员函数来初始化 _M_weak_this 成员)。share_ptr 内部中的引用计数是线程安全的,但是引用的资源不是线程安全的。 阅读详情

SharePtr的简单实现

#include <iostream>
#include<string>
using namespace std;
#pragma warning(disable:4996)
template<class T, class Del>
class SharePtr
{
public:
    SharePtr(T* ptr) //构造函数
        :_ptr(ptr), _ref(new int(1))
    {
        cout << "SharePtr(T* ptr) " << endl;
    }
    SharePtr(SharePtr& cp)//拷贝构造函数
    {
        cout << "SharePtr(SharePtr& cp)" << endl;
        _ptr = cp._ptr;
        _ref = cp._ref;
        (*_ref)++;
    }
    ~SharePtr()//析构函数 
    {
        Release();
    }
    void Release()
    {
        if (--(*_ref) == 0)
        {
            delete _ref;
            _del(_ptr);
        }
    }
    T* operator->()//->操作符重载
    {
        return _ptr;
    }
    T& operator*()//解引用操作符重载
    {
        return *_ptr;
    }
    SharePtr& operator=(SharePtr& sp)//赋值操作符重载
    {
        if (_ptr != sp._ptr)
        {
            Release();
            _ptr = sp._ptr;
            _ref = sp._ref;
            (*_ref)++;
        }
        return *this;
    }

private:
    T* _ptr;
    int* _ref;
    Del _del;//这是一个对象函数决定着析构时以什么方式释放申请的空间
};
//以上为class SharePtr的内容
template<class T>
struct Delete
{
    void operator()(T* ptr)
    {
        cout << "delete" << endl;
        delete ptr;
    }
};
template<class T>
struct DeleteArr
{
    void operator()(T* ptr)
    {
        cout << "delete[]" << endl;
        delete[] ptr;
    }
};
template<class T>
struct Free
{
    void operator()(T* ptr)
    {
        cout << "free" << endl;
        free(ptr);
    }
};
template<class T>
struct Close
{
    void operator()(T* ptr)
    {
        cout << "close" << endl;
        if (ptr != NULL)
        {
            fclose(ptr);
        }
    }
};
//以上为对象函数
//下面为主函数代码
int main()
{
    SharePtr<int, Delete<int>>  p1(new int(10));
    SharePtr<int, Delete<int>> p2(p1);
    SharePtr<string, DeleteArr<string>>  p3(new string[3]);
    SharePtr<string, DeleteArr<string>> p4(p3);
    SharePtr<string, DeleteArr<string>> p5(p4);
    SharePtr<int, Delete<int>> p6(new int(20));
    SharePtr<int, Free<int>> p7 = (int*)malloc(sizeof(int));
    SharePtr<FILE, Close<FILE>> p8 = fopen("FILENAME", "r");

    cout << *p1 << "," << *p2 << endl;
    p2 = p6;
    *p1 = 15;
    cout << *p1 << "," << *p2 << endl;
    return 0;
}

结果为
这里写图片描述

智能指针AutoPtr,ScopedPtr的模拟实现 智能指针: 所谓智能指针就是智能/⾃动化的管理指针所指向的动态资源的释放 为什么我们会有智能指针呢,我们通过下面的代码来看一下 void DoSomeThing () { throw 2 ; } void Test2 () { int* p1 = new int(2); try { DoSomeThing( 阅读详情

相关推荐

关于shared_ptr智能指针的简单理解

关于shared_ptr智能指针的简单理解什么是智能指针使用智能指针的优点shared_ptr的源码分析(超简化版)对shared_ptr智能指针的简单使用初始化`shared_ptr`通过`shared_ptr`调用类函数关于通过用`shared_ptr`生成数组的问题关于使用`shared_ptr`的注意事项 什么是智能指针 智能指针是一个模板函数,为我们封装好了一系列的方法来进行内存的自动管理。本质上我们也可以通过编写自己的模板类来实现和智能指针类似的功能,后续会提到相关的内容。 使用智能指针的优点

easterngodofwar的博客 812

C++:共享指针shared_ptr的理解与应用

文章目录前言一、shared_ptr的理解二、shared_ptr的初始化2.1.构造函数构造2.2.make_shared辅助函数三、shared_ptr常用函数四 、注意4.1.常见错误(注意以下代码全是错误代码)五、文章分享 前言 大家好,我是不会编程的程序猿,下面我将分享C++中的一个重要知识点,共享指针shared_ptr的理解和应用 一、shared_ptr的理解 智能指针shared_ptr 是存储动态创建对象的指针,其主要功能是管理动态创建对象的销毁,从而帮助彻底消除内存泄漏和悬空指针

weixin_41504987的博客 3万+

掌握智能指针shared_ptr的精髓:底层原理与实际应用全解析

C++智能指针shared_ptr是一种可以自动管理内存的智能指针,它是C++11新增的特性之一。与传统指针不同,shared_ptr可以自动释放所管理的动态分配对象的内存,并避免了手动释放内存的繁琐操作,从而减少了内存泄漏和野指针的出现。shared_ptr是一个模板类,通过引用计数器实现多个智能指针共享对一个对象的所有权。每次复制一个shared_ptr对象时,该对象的引用计数器会增加1,当最后一个shared_ptr对象被销毁时,引用计数器减1,如果引用计数器变为0,则释放所管理的对象的内存。

Lion_Long的博客 1万+

shared_ptr

2.在赋值前要先将自生的资源移交出去,即就是将自身指向的引用计数减一,如果减一后引用计数为0,那么就调用删除器将资源删除,表示没有指针指向当前资源。2、当任何shared_ptr对象超出作用时,则在器析构函数中,将与资源对象关联的引用计数变为0,则表示没有其他shared_ptr对象与此资源对象关联,在这种情况下榻使用delete删除器删除该资源对象。析构的是当前指针,先判断是否为空,再引用计数减一,如果结果为0,则调用删除器先删除引用计数所致的对象,在删除指针。

m0_57719144的博客 4437

极化码理论及算法研究4-巴氏参数、GA算法以及matlab仿真

目录 (如要找其他内容,欢迎访问我的主页寻找) #前言 #极化码概述 #极化码定义 #极化码编码 #极化码译码 #5G标准中极化码的编译码概述 #5G标准中极化码的编码 #5G标准中极化码的译码 #总结 极化码编码 ...

1万+

逐飞vs龙邱:英飞凌miniwiggler仿真器硬件接口差异全解析(附拆机对比图)

本文通过拆解对比逐飞与龙邱两家厂商的英飞凌miniwiggler仿真器,详细解析了其硬件接口的核心差异。重点分析了Type-C接口的取舍、DAP调试协议(SWD)的支持、电源设计(跳线帽vs拨码开关)以及工艺用料,为嵌入式开发者与智能车竞赛选手提供了清晰的选型参考和实际应用建议。

weixin_29189003的博客 113

share_ptr智能指针使用详解

share_ptr 智能指针,也被称为共享指针,用于管理可以由多个智能指针共同拥有的动态分配对象。特别是,类型 shared_ptr<T> 用于管理 T 类型对象的所有权。 类构造函数 shared_ptr<T>(T * ptr) 可用于创建共享指针,管理由裸指针 ptr 给定地址的对象。shared_ptr 类可以重载指针运算符*和->。以下示例创建了一个由共享指针管理的动态分配整数,然后即可通过该指针访问它: int main() { shared_ptr&lt...

肥嘟嘟的左卫门 5470

增量编码器资讯大全

增量编码器是什么 增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小,按照工作原理编码器可分为增量式和绝对式两类。 增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。 编码器是把角位移或直线位移转换成电信号的一种装置。前者称为码盘,后者称码尺.按照读出方式编码器可以分为接触式和非接触式两种.接触式采...

kindele的博客 6009

【干货】share智能指针的模拟实现

智能指针是C++实现自动内存管理的一种手段,本质是通过对象出作用域会自动析构,让对象保存与所需管理的目标指针指向同一片动态开辟空间的地址,出作用域会自动析构。这里模拟了,boost中的share智能指针,代码如下:#pragmaonce template<classT> classSharePtr { public: SharePtr(T*ptr)...

weixin_34261415的博客 119

瑞萨芯片串口配置,基于RL78芯片的串口使用配置

在这里隆重给大家介绍瑞萨编辑器CS+ for CA 的自动生成代码功能,只需要配置几个参数,就可以得到你想要的串口配置了,我现在已经忘记怎么手动配置寄存器了,哈哈。选择设置,此时将端口设置成功接下来设置时钟,根据自己的芯片所需设置相应的时钟,自己芯片是什么时钟查看数据手册和原理图可以找到。瑞萨芯片的串口配置其实和ST芯片的串口配置差不多,只是ST芯片的中文数据手册比较多,就更好配置了,找到所需要的串口配置IO口,此时将UART0 配置为引脚P61和P62,瑞萨芯片的串口配置竟然要配置串口。

qq_45315904的博客 4303

基于STM32的3D打印机控制

通过本项目,我们成功搭建了一个基础的3D打印机控制系统,能够控制步进电机和加热元件。这为使用STM32开发功能丰富的3D打印机提供了基础,您可以在此基础上继续扩展功能,如增加LCD显示、SD卡存储、联网控制等功能。在这个项目中,我们将使用STM32微控制器开发一个基础的3D打印机控制系统。通过控制步进电机、加热元件和温度传感器,我们将实现一个简单的FDM(熔融沉积制造)3D打印机控制。- 检查PWM信号的生成功能,确认加热元件的控制逻辑是否正常。- 增加适当的滤波和校准算法,以提高温度读取的准确性。

2401_88938661的博客 1504

shared_ptr智能指针简单实现

shared_ptr 通过引用计数的方式来管理内存,即每个 shared_ptr 对象都会维护一个引用计数器,记录有多少个 shared_ptr 对象指向同一个对象。shared_ptr智能指针对象在离开作用域后就会调用析构函数,--(*ref_count_) == 0 语句判断是否只有自己一个指针指向对象,即引用计数减1后是否为0,如果是,我们就释放掉指针指向的资源,即对象资源。可以看到每创建一个智能指针对象指向同一个对象时,计数器ref_count_就会加1,这个是shared_ptr的核心。

Sakeyuan的博客 482

【智驾与大模型】端到端与多模态大模型的精彩之旅

智驾和大模型的回顾与展望。开头的笔者自述也说了些心窝子话,边缘计算的监管刻不容缓!

仿生实验室:从0到1,制作人脸表情交互机器人,记录过程,软硬件全部开源,与君共襄盛举! 1320

SharePtr的简单实现

智能指针就是一个智能的指针:有以下两个特点 管理指针指向对象的释放问题; 又能像指针一样使用。 所以可以用RAII(资源获取就是初始化)的方式设计一个指针的对象用它的析构函数来管理资源、避免内存泄露。shared_ptr是一个智能指针,比起auto_ptr 、unique它更像一个智能指针。下面看一下SharePtr的简单实现↓ template<class T,class Del> class S

shaoshuyuan的博客 2005

WPF+MVVM案例实战(二十三)- 阴影效果详解

通过附加属性实现阴影效果,通过改变不同的阴影属性值达到不同阴影效果

lingshuangcanxue 561

open3d将某一时间序列下的彩色图和深度图批量转换成点云(python)

必备条件需要3D相机生成的彩色图及深度图,注意要将深度图与彩色图对齐(一般3D相机自带对齐算子),以及3D相机的彩色图内参(相机自带内参获取功能)。有了此彩色图、对齐后的深度图以及相机内参就能使用open3d生成彩色点云了.

吾名招财的博客 315

共享智能指针(SharePtr)的C++实现

C++ 智能指针(共享指针)实现 主要实现思想是引用计数法,在SharePtr类拷贝(Copy)和赋值(=)的时候引用计数加1,而在SharePtr类变量析构的时候引用计数减少1 实现细节 (1)SharePtr包裹类变量指针和引用计数指针int*, 这里引用计数采用 int* 为了在各个SharePtr变量实现计数共享,每个变量的计数变化都会影响其他计数 template&...

qq_29523119的博客 1814

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

智能指针---SharePtr/SharePtrArray

智能指针 ---->SharePtr / SharePtrArray 模拟实现

CodingStart 778

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

shared_ptr智能指针的简单实现

shared_ptr code1 #include <bits/stdc++.h> using namespace std; template <typename T> class SmartPointer { public: //构造函数 SmartPointer(T *p = 0) : _ptr(p), _reference_count(new size_t) { if (p) *_reference_count

Counting_Stars的博客 286

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

模拟实现shareptr 智能指针

shared_ptr的原理 通过引用计数的方式来实现多个shared_ptr对象之间共享资源 例如:公司晚上会通知,最后走的员工把灯关掉 shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享 在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减1 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源 如...

ladykiller21的博客 440

string类和智能指针(简洁版)和shareptr简洁版代码实现

/*#include using namespace std; #include template class String { public: String() { _str = new char[1]; _str[0] = '\0'; } String(const char *str) { _str = new char[strlen(str) + 1]; str

dreamhighiy的专栏 521

C++智能指针

首先需要了解RAII思想,什么是RAII思想,RAII是一种利用对象生命周期来控制程序资源(内存、文件句柄、网络连接、互斥量)的简单技术。通俗易懂来讲就是在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。就有如下好处: 不需要显式的释放资源 对象所需的资源在其生命周期内始终保持有效 template&lt;class T&gt; cla...

弯弯传奇的博客 304

手撕智能指针shareptr

手撕一个share_ptr智能指针

qq_41511474的博客 545

线程安全的shareptr 简单实现

【代码】线程安全的shareptr 简单实现。

LIJIWEI0611的博客 539

C++_智能指针的基本原理

智能指针的核心思想是将资源(内存)与指针对象的生命周期绑定起来,创建对象的同时立即为其分配资源,对象销毁时立即释放资源。 1、智能指针和资源的绑定 将裸指针和它相关的操作封装成一个类,并在创建对象时必定要调用的构造函数中,分别进行资源的分配和释操作。当然,为了保证对象的操作方式看起来与裸指针相同,这个封装类起码还要重载operator->和operator * 一个简单的,在其生命周期中绑定...

CLZHIT的博客 323

SharePtr非侵入版本

【李巍(noslopforever·天堂里的死神)原作,转载请注明出处】本Blog原来那篇《智能指针三兄弟》:http://blog.youkuaiyun.com/noslopforever/archive/2006/12/19/1449569.aspx,在智能指针的使用上,使用了侵入式的设计。欲使用智能指针,则必须为每个使用智能指针的类生成一个static的INVALID对象。如果是自己写一个库

noslopforever [天堂里的死神] 1919
上一篇: Linux下vim的设置
下一篇: list 迭代器的简单实现
qiting00
博客等级 码龄10年 7粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值