智能指针的简单实现-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

西电 程序设计基础课程设计 作业

当时做的程序设计课程的作业. 一共五题, 以报告的形式提交. 质量应该比较高(高傲). 完整内容在这里 高精度计算 问题描述 涉及知识点: 数组, 流程控制, 函数等 要求: 用整型数组表示10进制大整数(超过 2322^{32}232 的整数), 数组的每个元素存储大整数的一位数字, 实现大整数的加减法. 问题分析 结构设计 可将高精度整数写成一个类. 成员变量有: int a[MAXN], len; bool negative; 其中, 数组a用来存储大整数的一个数位, a[1]为个位上的数字, a

Wings 2513

汽车工程师必看:从CAN到Ethernet,6种车载通信协议全解析(附应用场景对比)

本文全面解析了从CAN到Ethernet的6种车载通信协议,包括CAN、LIN、MOST、FlexRay等,并对比了它们的应用场景和技术特点。文章详细介绍了各协议的演进历程、技术优势及在现代汽车中的混合网络架构设计,为汽车工程师提供了实用的协议选型指南和未来通信技术发展趋势。

weixin_28683689的博客 492

share_ptr智能指针使用详解

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

肥嘟嘟的左卫门 5470

如何构建高质量的 QA 问答知识库

NLP 技术落地最普遍的场景就是智能客服,如阿里的”小蜜“,京东的“JIMI”等等。NLP 技术也广泛应用于搜索系统。无论是“智能客服”,还是“搜索系统”,构建的前提是拥有“高质量的QA知识库”。今天聊聊“如何构建高质量QA知识库。”。 历史对话数据分布分析 基于公司现有系统积累的大规模对话文本数据,需要对文本数据进行归类处理,分析每个部分数据的占比,挖掘出有价值的文本通过 NLP 相关技术进行商业价值转化。下文以医疗领域来举例说明,通过输入对象,可以将文本分为客服输入和用户输入两部分。挖掘相关问题,主要从

Jiassheng的博客 2153

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

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

weixin_34261415的博客 119

Microsoft Speech SDK 使用过程中女声改为男声遇到的问题

问题将女生改为系统自带男声(Kangkang)根据上面的步骤我的播放声音是改变了,但是还是女生,是yaoyao的女生。是因为下面注册表路径中VoicePath这个配置的路径指向了yaoyao的文件。 如何使用Microsoft Speech SDK,请参考https://blog.youkuaiyun.com/daoming1112/article/details/77542562 使用系统自带男声语音,不需...

u012161365的博客 7538

Vivado FFT IP核避坑指南:从Matlab数据生成到FPGA验证的完整流程

本文详细解析了Vivado FFT IP核从Matlab数据生成到FPGA验证的完整流程,重点解决跨平台数据一致性、IP核配置陷阱和验证方法论等核心问题。通过实战案例和避坑指南,帮助工程师高效实现FFT运算的硬件验证,确保结果与Matlab的误差控制在0.3%以内。

weixin_42543046的博客 398

shared_ptr智能指针简单实现

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

Sakeyuan的博客 482

软考29-上午题-【数据结构】-排序

数据结构7种排序

qq_31532983的博客 1579

SharePtr的简单实现

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

shaoshuyuan的博客 2005

从模糊到清晰:让AI教相机自动对焦的实战指南

AI自动对焦技术:让模糊照片成为过去式 深度学习驱动的自动对焦技术正颠覆传统摄影,使相机能在复杂场景下智能锁定焦点。相比传统对焦方法在弱光、低对比度环境下的失效,AI通过学习"清晰-模糊"规律,实现全场景精准对焦。本文详细解析了该技术的三大优势: 自适应各种光线条件; 毫秒级对焦速度; 突破物理限制的精度。 通过PyTorch搭建的CNN模型,展示了从数据采集到模型训练的全流程实战方案,包括使用拉普拉斯算子评估图像清晰度等关键技术。该技术已成功应用于手机摄影、工业检测、无人机航拍和安防监

LXY_LOVE36的博客 348

【数据分析八步法】将模糊需求转化为可验证的分析问题

国内访问Huggingface官方源常遇网络问题,可通过切换国内镜像提升下载速度。三种配置方式:1)设置HF_ENDPOINT环境变量;2)在from_pretrained中直接指定镜像参数;3)修改本地Huggingface配置文件。常用镜像包括hf-mirror.com、阿里云ModelScope和清华镜像源。注意镜像同步延迟、私有模型限制,建议配合huggingface-cli工具使用,必要时取消代理设置。合理配置镜像源可显著改善Huggingface生态使用体验。

Mr数据杨 858

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

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

qq_29523119的博客 1814

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

智能指针---SharePtr/SharePtrArray

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

CodingStart 778

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

模拟实现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、付费专栏及课程。

余额充值