返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++的智能指针使用实例分析
  • 471
分享到

C++的智能指针使用实例分析

2023-06-29 19:06:05 471人浏览 独家记忆
摘要

今天小编给大家分享一下c++的智能指针使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是RaiIRAII(Re

今天小编给大家分享一下c++的智能指针使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    什么是RaiI

    RAII(Resource Acquisition Is Initialization)是由C++之父提出的,中文翻译为资源获取即初始化,使用局部对象来管理资源的技术称为资源获取即初始化;这里的资源主要是指操作系统中有限的东西如内存(heap)、网络套接字、互斥量、文件句柄等等,局部对象是指存储在栈的对象,它的生命周期是由操作系统来管理的,无需人工介入

    RAII的原理

    资源的使用一般经历三个步骤:

    • 获取资源(创建对象)

    • 使用资源

    • 销毁资源(析构对象)

    但是资源的销毁往往是程序员经常忘记的一个环节,所以程序界就想如何在程序中让资源自动销毁呢?解决问题的方案就是:RAII,它充分的利用了C++语言局部对象自动销毁的特性来控制资源的生命周期

    裸指针存在的问题

    难以区分指向的是单个对象还是一个数组

    使用完指针之后无法判断是否应该销毁指针,因为无法判断指针是否”拥有“指向的对象

    在已经确定需要销毁指针的情况下,也无法确定是用delete关键字删除,还是有其他特殊的销毁机制,例如通过将指针传入某个特定的销毁函数来摧毁指针

    即使已经确定了销毁指针的方法,由于1的原因,仍然无法确定到底是i用delete(销毁单个对象)还是delete[](销毁一个数组)

    假设上述的问题都解决了,也很难保证在代码的所有路径中(分支结构,异常导致的挑战),有且仅有一次销毁指针的操作;任何一条路径遗漏都可能导致内存的泄露,而销毁多次则会导致未定义行为

    理论上没有方法来分辨一个指针是否处于悬挂状态

    auto_ptr

    class Object{int value;public:Object(int x = 0) :value(x){cout << "Create Object:" << this << endl;}~Object(){cout << "Destory Object:" << this << endl;}int& Value(){return value;}};template<class _Ty>class my_auto_ptr{private:bool _Owns;_Ty* _Ptr;public:my_auto_ptr(_Ty* p = NULL) :_Owns(p != NULL), _Ptr(p){}~my_auto_ptr(){if (_Owns){delete _Ptr;}_Owns = false;_Ptr = NULL;}};void fun(){my_auto_ptr<Object> obj(new Object(10));}int main(){fun();}

    C++的智能指针使用实例分析

    C++的智能指针使用实例分析

    在这里将Object构建完成后,将其指针给到p,当函数结束去调动智能指针的析构函数去释放空间

    若我们需要在fun()函数中,去调用Object类的方法obj->Value();

    class Object{int value;public:Object(int x = 0) :value(x){cout << "Create Object:" << this << endl;}~Object(){cout << "Destory Object:" << this << endl;}int& Value(){return value;}};template<class _Ty>class my_auto_ptr{private:bool _Owns;_Ty* _Ptr;public:my_auto_ptr(_Ty* p = NULL) :_Owns(p != NULL), _Ptr(p){}~my_auto_ptr(){if (_Owns){delete _Ptr;}_Owns = false;_Ptr = NULL;}_Ty* get()const{return _Ptr;}_Ty& operator*()const{return *(get());}_Ty* operator ->()const{return get();}};void fun(){my_auto_ptr<Object> obj(new Object(10));cout << obj->Value() << endl;cout << (*obj).Value() << endl;}int main(){fun();}

    C++的智能指针使用实例分析

    通过运算符重载,(*obj) 后将直接指向堆区(heap)的对象实体

    若我们通过一个my_auto_ptr去创建另一个my_auto_ptr

    class Object{int value;public:Object(int x = 0) :value(x){cout << "Create Object:" << this << endl;}~Object(){cout << "Destory Object:" << this << endl;}int& Value(){return value;}};template<class _Ty>class my_auto_ptr{private:bool _Owns;_Ty* _Ptr;public:my_auto_ptr(_Ty* p = NULL) :_Owns(p != NULL), _Ptr(p){}~my_auto_ptr(){if (_Owns){delete _Ptr;}_Owns = false;_Ptr = NULL;}my_auto_ptr(const my_auto_ptr& obj):_Owns(obj._Owns),_Ptr(obj._ptr){}my_auto_ptr& operator=(const my_auto_ptr& _Y){if(this == &_Y) return *this;if(_Owns){delete _Ptr;}_Owns = _Y._Owns;_Ptr = _Y._Ptr;return 0;}_Ty* get()const{return _Ptr;}_Ty& operator*()const{return *(get());}_Ty* operator ->()const{return get();}void reset(_Ty* p = NULL){if (_Owns){delete _Ptr;}_Ptr = p;}_Ty* release()const{_Ty* tmp = NULL;if (_Owns){((my_auto_ptr*)this)->_Owns = false; //常性进行修改tmp = _Ptr;((my_auto_ptr*)this)->_Ptr = NULL;}return tmp;}};void fun(){my_auto_ptr<Object> pobja(new Object(10));my_auto_ptr<Object> pobjb(pobja);}int main(){fun();}

    如果通过浅拷贝,则两个指针拥有同一个资源,在析构的过程会造成资源的重复释放导致崩溃

    若设置为将其资源进行转移

    my_auto_ptr(const my_auto_ptr& obj):_Owns(obj._Owns),_Ptr(release()){}my_auto_ptr& operator=(const my_auto_ptr& _Y){if(this == &_Y) return *this;if(_Owns){delete _Ptr;}_Owns = _Y._Owns;_Ptr = _Y.release();return 0;}
    void fun(my_auto_ptr<Object> apx){int x = apx->Value();cout<<x<<endl;}int main(){my_auto_ptr<Object> pobja(new Object(10));fun(pobja);int a = pobja->Value();cout<<a<<endl;}

    那么上面的过程中,资源会进行转移pobja将不再拥有资源,导致pobja失去资源进而程序崩溃

    这也就是auto_ptr的局限性,也导致该智能指针的几乎没有使用

    unique_ptr

    该智能指针属于唯一性智能指针,将拷贝构造删除,也就不能将其新建另一个对象,同时也不能作为参数传入

    class Object{int value;public:Object(int x = 0) :value(x){cout << "Create Object:" << this << endl;}~Object(){cout << "Destory Object:" << this << endl;}int& Value(){return value;}};int main(){std::unique_ptr<Object> pobja(new Object(10));//std::unique_ptr<Object> pobjb(pobja); error//不允许std::unique_ptr<Object> pobjb(std::move(pobja));}

    通过移动赋值是可以的,通过明确的概念,对其资源进行转移

    同时unique_ptr可以区分其所指向的是一个单独空间,或者是连续的空间

    struct delete_ar_object{void operator()(Object* op){if(op == NULL) return;delete[] op;}}int main(){std::unique_ptr<Object> pobja(new Object(10));std::unique_ptr<Object,delete_ar_object> pobjb(new Object[10]);}

    在这里如果是连续空间,会调用删除连续空间的删除器;单独空间则使用默认删除器

    unique_ptr在编写的时候,有多个模板类,分别对应单个对象的方案和一组对象的方案

    并且可以通过智能指针指向fopen打开的文件对象,而文件对象是同fclose去进行关闭的

    struct delete_file{void operator()(FILE *fp){if(fp == NULL) return;fclose(fp);}}std::unique_ptr<FILE,delete_file> pfile(fopen("zyq.txt","w"));

    这里只需要将默认的删除器,更改为对文件对象的删除器

    以上就是“C++的智能指针使用实例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网其他教程频道。

    --结束END--

    本文标题: C++的智能指针使用实例分析

    本文链接: https://lsjlt.com/news/326116.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • C++智能指针使用实例分析
      这篇文章主要介绍了C++智能指针使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++智能指针使用实例分析文章都会有所收获,下面我们一起来看看吧。1.简介程序运行时存在静态空间、栈和堆区,用堆来存储动...
      99+
      2023-06-30
    • C++的智能指针使用实例分析
      今天小编给大家分享一下C++的智能指针使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是RAIIRAII(Re...
      99+
      2023-06-29
    • C++智能指针实例代码分析
      这篇文章主要讲解了“C++智能指针实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++智能指针实例代码分析”吧!一、内存泄漏-永恒的话题动态申请堆空间,用完后不归还C++ 语言中...
      99+
      2023-06-30
    • C++智能指针shared_ptr与weak_ptr的实现分析
      目录shared_ptrweak_ptr内存模型RefCnt 和 Mdel实现shared_ptr 实现weak_ptr 实现shared_from_this()循环引用shared...
      99+
      2024-04-02
    • c++智能指针unique_ptr的使用
      目录1.为什么需要unique_ptr2.什么是unique_ptr3.unique_ptr特性4.如何使用unique_ptr4.1简单使用4.2指向数组5.unique_ptr需...
      99+
      2024-04-02
    • C++11智能指针unique_ptr用法使用场景分析
      一、概述 C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr...
      99+
      2024-04-02
    • C++深入分析讲解智能指针
      目录1.简介2.unique_ptr指针(独占指针)3.shared_ptr指针(共享所有权)4.weak_ptr(辅助作用)5.自实现初级版智能指针6.总结1.简介 程序运行时存在...
      99+
      2024-04-02
    • C语言指针使用实例分析
      今天小编给大家分享一下C语言指针使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。何为指针指针这玩意说白了,就是用来...
      99+
      2023-07-02
    • C++学习之移动语义与智能指针的实例分析
      这篇文章给大家分享的是有关C++学习之移动语义与智能指针的实例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。移动语义1.几个基本概念的理解(1)可以取地址的是左值,不能取地址的就是右值,右值可能存在寄存器,也...
      99+
      2023-06-15
    • C++的this指针实例分析
      这篇文章主要介绍了C++的this指针实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++的this指针实例分析文章都会有所收获,下面我们一起来看看吧。this指针是存在与类的成员函数中,指向被调用函数...
      99+
      2023-06-27
    • C++中指针实例分析
      这篇文章主要介绍“C++中指针实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中指针实例分析”文章能帮助大家解决问题。计算机的内存模型CPU是计算机的核心部件,要想让一个CPU工作,就必...
      99+
      2023-06-19
    • C++ 智能指针代码解析
      目录前言1,aoto_ptr2,unique_ptr3,share_ptr4, weak_ptr总结前言 如果在程序中使用new从堆分配内存,等到不再需要时,应使用delete将其释...
      99+
      2024-04-02
    • C++11 智能指针的具体使用
      目录智能指针的原理RAII智能指针的原理auto_ptr1.auto_ptr的使用及问题unique_ptrshared_ptrshared_ptr的循环引用智能指针的原理 RAII...
      99+
      2024-04-02
    • C++使用智能指针实现模板形式的单例类
      本文通过实例为大家分享了C++使用智能指针实现模板形式的单例类的具体代码,供大家参考,具体内容如下 实现一个模板形式的单例类,对于任意类型的类经过Singleton的处理之后,都能获...
      99+
      2024-04-02
    • C++中怎么使用智能指针
      这篇文章给大家介绍C++中怎么使用智能指针,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、为什么要使用智能指针一句话带过:智能指针就是帮我们C++程序员管理动态分配的内存的,它会帮助我们自动释放new出来的内存,从而...
      99+
      2023-06-20
    • C++中如何使用智能指针
      这期内容当中小编将会给大家带来有关C++中如何使用智能指针,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。内存泄露是C++程序员都头疼的大问题。C++缺乏像JAVA、C#一样,拥有GC这么一项有利的武器,它...
      99+
      2023-06-17
    • C++智能指针shared_ptr怎么使用
      本篇内容介绍了“C++智能指针shared_ptr怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、什么是shared_ptr?C+...
      99+
      2023-06-29
    • C语言指针应用实例分析
      这篇文章主要讲解了“C语言指针应用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言指针应用实例分析”吧!1、指针是什么指针理解的2个要点:平时口语中说的指针,通常指的是指针变量,...
      99+
      2023-06-30
    • C++智能指针之shared_ptr的具体使用
      目录std::shared_ptr概念shared_ptr模板类shared_ptr的构造和析构shared_ptr赋值make_shared计数线程安全?enable_shared...
      99+
      2024-04-02
    • 深入了解C++智能指针的使用
      目录一、C++11智能指针概述二、C++98中的智能指针三、C++11中的智能指针1.unique_ptr2.shared_ptr3.weak_ptr一、C++11智能指针概述 在C...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作