400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

【c++复习笔记】——智能指针详细解析(智能指针的使用,原理分析)-创新互联

  • 💂 个人主页:努力学习的少年
  • 🤟 版权: 本文由【努力学习的少年】原创、在首发、需要转载请联系博主
  • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

目录

成都创新互联-专业网站定制、快速模板网站建设、高性价比新晃网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式新晃网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖新晃地区。费用合理售后完善,10年实体公司更值得信赖。

一. 智能指针的基本概念

二.  智能指针的定义和使用

三. auto_ptr

四. unique_ptr

五. share_ptr

1. shared_ptr的基本概念

2. shared_ptr的原理

3. shared_ptrd的实现

4. shared_ptr的循环引用

5. 定制删除器


一. 智能指针的基本概念 1. RAll

RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。
在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:

  • 不需要显式地释放资源。 
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。
2.智能指针概念

在c++中,动态内存的管理式通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化;delete,接受一个动态对象的指针,销毁该对象,并释放与之关联的内存。动态内存的使用很容易出现问题,因为确保在正确的时间释放内存是极其困难的。有时使用完对象后,忘记释放内存,造成内存泄漏的问题。

下面是智能指针的基本框架,所有的智能指针类模板中都需要包含一个指针对象,构造函数和析构函数。

二.  智能指针的定义和使用

综上所述,我们不能使用原生的拷贝构造函数和赋值重载函数,并且定义的拷贝构造函数和赋值重载函数需要考虑只能释放一次资源对象。

c++库中的智能指针 三. auto_ptr

auto_ptr是c++98版本库中提供的智能指针,该指针解决上诉的问题采取的措施是管理权转移的思想,也就是原对象拷贝给新对象的时候,原对象就会被设置为nullptr,此时就只有新对象指向一块资源空间。

如果auto_ptr调用拷贝构造函数或者赋值重载函数后,如果再去使用原来的对象的话,那么整个程序就会崩溃掉(因为原来的对象被设置为nullptr),这对程序是有很大的伤害的.所以很多公司会禁用auto_ptr智能指针。

auto_ptr的拷贝构造函数和赋值重载函数的实现

四. unique_ptr

unique_ptr是c++11版本库中提供的智能指针,它直接将拷贝构造函数和赋值重载函数给禁用掉,因此,不让其进行拷贝和赋值。

unique_ptr的拷贝函数和赋值重载函数

五. share_ptr 1. shared_ptr的基本概念

share_ptr是c++11版本库中的智能指针,shared_ptr允许多个智能指针可以指向同一块资源,并且能够保证共享的资源只会被释放一次,因此是程序不会崩溃掉。

2. shared_ptr的原理

shared_ptr采用的是引用计数原理来实现多个shared_ptr对象之间共享资源:

引用计数是用来记录资源对象中有多少个指针指向该资源对象。

销毁过程:

3. shared_ptrd的实现

赋值重载的三种情况:

4. shared_ptr的循环引用

shared_ptr固然好用,但是它也会有问题存在。假设我们要使用定义一个双向链表,如果我们想要让创建出来的链表的节点都定义成shared_ptr智能指针,那么也需要将节点内的_pre和_next都定义成shared_ptr的智能指针。如果定义成普通指针,那么就不能赋值给shared_ptr的智能指针。

当其中两个节点互相引用的时候,就会出现循环引用的现象。如下:

那么如何解决这个shared_ptr的循环引用呢?

weak_ptr对象指向shared_ptr对象时,不会增加shared_ptr中的引用计数,因此当node1销毁掉时,则node1指向的空间就会被销毁掉,node2类似,所以weak_ptr指针可以很好解决循环引用的问题。

weak_ptr简单实现

5. 定制删除器

当我们释放一个指向数组的指针的时候,delete[]后面的空方括号是必须存在(如下),它指示编译器此指针指向的是一个对象数组的第一个元素,如果我们在delete一个指向数组的指针中忽略了方括号,我们的程序可能在执行过程中在没有任何警告下行为异常。

因此,shared_ptr 类中提供了一个构造函数可以自定义一个删除器去指定析构函数的删除方式。

这个自定义删除器可以是函数指针,仿函数,lamber,包装器。

仿函数的删除器

shared_ptr中的析构函数会去调用DelArry仿函数去释放动态数组。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文题目:【c++复习笔记】——智能指针详细解析(智能指针的使用,原理分析)-创新互联
本文来源:http://www.bluegullmedia.com/article/coscpd.html

其他资讯

让你的专属顾问为你服务

0.0469s