为什么需要智能指针

参考自https://www.cnblogs.com/round1/p/12906648.html

主要为了避免以下Bug:

内存泄露   :对象无法被释放,最常见的问题。
野指针       : 指针指向未知。
重复释放   :    顾名思义。

 


 

(一)内存泄露 : 

 1. 抛出异常,函数中途退出,释放操作没有执行

C * c = new C;
throw; //抛出
delete c; //没有执行

2 . 忘记释放

注意:  指针变量(值语义)一旦被销毁,所指向的对象(对象语义)将无法释放

void f()
{C * c = new C();
   //delete c; //忽略 }

 

结果:内存无法释放,直到压榨完程序的所以内存。

 

(二)野指针 :

1. 未初始化

C * c;//指向哪呢???

2.  指针变量指向的对象被释放后,指针就变成了野指针,注意:即使释放完马上置空,仍然非常容易出错。

C * c = new C();
C * c2 = c;

delete c;
c = nullptr; //释放并置空
//c2 = nullptr
c2非常容易被忽略。你永远不知道有多少个c2, c3,在什么地方存在这些指针。

 

结果:未定义,不可预测的行为

 

(三)重复释放 :

c2 = c;
delete c; delete c2;

  

结果:程序异常结束。

 


 

 智能指针

上一章提到,值语义对象作为局部变量,存储在栈区,生命周期由程序管理,因此值语义可以作为资源句柄

这个技术叫做RALL,在资源句柄的构造函数进行资源初始化,在析构函数进行资源释放


智能指针,就是值语义的资源句柄。将对象语义转为值语义,至少从抽象的角度看起来是这样。

 

智能指针是解决了以上的问题吗?

1. 因为智能指针是值语义的,所以保证不发生内存泄露和重复释放。

2. 智能指针执行默认初始化和智能指针一定在对象销毁之前销毁,所以不可能出现野指针。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode1068. 产品销售分析 I(SQL)

销售表 Sales: -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- (sale_id, year) 是销售表…

多进程与多线程通信同步机制

多进程通信方式 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关…

leetcode1069. 产品销售分析 II(SQL)

销售表:Sales -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- sale_id 是这个表的主键。…

leetcode1070. 产品销售分析 III(SQL)

销售表 Sales: -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- sale_id 是此表的主键。 …

C/C++中static的用法全局变量与局部变量

转载自C/C中static的用法全局变量与局部变量 1.什么是static? static 是C/C中很常用的修饰符,它被用来控制变量的存储方式和可见性。 1.1static的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间&…

查看商品图片,鼠标悬浮图片放大js实现

2010-06-07 10:18:46|分类&#xff1a;Javascript|字号订阅 <%pagelanguage"java"import"java.util.*"pageEncoding"UTF-8"%> <%pageimport"com.pojo.Products"%> <% String path request.getContextPath(); String b…

leetcode547. 朋友圈

班上有 N 名学生。其中有些人是朋友&#xff0c;有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友&#xff0c;B 是 C 的朋友&#xff0c;那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈&#xff0c;是指所有朋友的集合。 给定一个 N * N 的矩阵 M&#xff0c;表…

C++中volatile关键字

转载https://blog.csdn.net/weixin_44363885/article/details/92838607 一、volatile介绍 volatile提醒编译器它后面所定义的变量随时都有可能改变&#xff0c;因此编译后的程序每次需要存储或读取这个变量的时候&#xff0c;都会直接从变量地址中读取数据。如果没有volatile…

leetcode261. 以图判树

给定从 0 到 n-1 标号的 n 个结点&#xff0c;和一个无向边列表&#xff08;每条边以结点对来表示&#xff09;&#xff0c;请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 示例 1&#xff1a; 输入: n 5, 边列表 edges [[0,1], [0,2], [0,3], [1,4]] 输…

leetcode323. 无向图中连通分量的数目

给定编号从 0 到 n-1 的 n 个节点和一个无向边列表&#xff08;每条边都是一对节点&#xff09;&#xff0c;请编写一个函数来计算无向图中连通分量的数目。 示例 1: 输入: n 5 和 edges [[0, 1], [1, 2], [3, 4]] 0 3 | | 1 --- 2 4 输出…

leetcode79. 单词搜索 网格地图搜索+回溯经典写法啦

给定一个二维网格和一个单词&#xff0c;找出该单词是否存在于网格中。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 示例: board [ [A,B,C…

leetcode1075. 项目员工 I(SQL)

项目表 Project&#xff1a; ---------------------- | Column Name | Type | ---------------------- | project_id | int | | employee_id | int | ---------------------- 主键为 (project_id, employee_id)。 employee_id 是员工表 Employee 表的外键。 员工…

leetcode1082. 销售分析 I (SQL)

产品表&#xff1a;Product ----------------------- | Column Name | Type | ----------------------- | product_id | int | | product_name | varchar | | unit_price | int | ----------------------- product_id 是这个表的主键. 销售表&#xff1a;Sale…

Oracle 获取当前日期及日期格式

Oracle 获取当前日期及日期格式 <wbr><wbr> 获取系统日期&#xff1a;<wbr><wbr><span style"padding:0px; margin:0px; color:rgb(255,0,0)">SYSDATE()<br style"padding-bottom:0px; padding-top:0px; padding-left:0px; ma…

leetcode1083. 销售分析 II(SQL)

Table: Product ----------------------- | Column Name | Type | ----------------------- | product_id | int | | product_name | varchar | | unit_price | int | ----------------------- product_id 是这张表的主键 Table: Sales --------------------…

leetcode1084. 销售分析III(SQL)

Table: Product ----------------------- | Column Name | Type | ----------------------- | product_id | int | | product_name | varchar | | unit_price | int | ----------------------- product_id 是这个表的主键 Table: Sales --------------------…

炸窝(Java)拼接

数组中插入相关练习 例题&#xff1a;定义一个方法 &#xff0c;将数组{1,2,3}按照指定的格式进行拼接成一个字符串 /*例题&#xff1a;定义一个方法 &#xff0c;将数组{1,2,3}按照指定的格式进行拼接成一个字符串&#xff0c; 格式定义如下[word1#word2#word3]. 思路分析&a…

leetcode71. 简化路径 Unix 风格

以 Unix 风格给出一个文件的绝对路径&#xff0c;你需要简化它。或者换句话说&#xff0c;将其转换为规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本身&#xff1b;此外&#xff0c;两个点 &#xff08;..&#xff09; 表示将…

李牛(Linux)脚本

Linux课堂笔记day01 主要总结内容&#xff1a; 一&#xff1a;Linux背景介绍 二&#xff1a;系统操作 三&#xff1a;服务管理 四&#xff1a;shell脚本 五&#xff1a;文本操作 六:常用服务搭建 01&#xff1a;初识linux 收获&#xff1a;可以熟练应对运维和开发 对以后的生…

leetcode601. 体育馆的人流量(SQL)

X 市建了一个新的体育馆&#xff0c;每日人流量信息被记录在这三列信息中&#xff1a;序号 (id)、日期 (visit_date)、 人流量 (people)。 请编写一个查询语句&#xff0c;找出人流量的高峰期。高峰期时&#xff0c;至少连续三行记录中的人流量不少于100。 例如&#xff0c;表…