文章目录

  • 前言
  • 一、智能指针是什么?
  • 二、示例
  • 总结

前言

C++对于内存管理的要求很高,如果不及时释放对象内存,就可能会发生内存泄露或野指针等情况,鉴于这种情况,C++11提出了智能指针的概念。

一、智能指针是什么?

智能指针可以将指针封装为一个栈对象,当不需要使用时,会在析构函数中释放掉申请的内存,所有的智能指针类均包含于头文件 < memory> 内。
其原理是:通过重载*,->,(),=运算符来完成普通指针的功能,并定义了一些成员函数,如reset,swap ,use_count,get等。
C++ 常见的有三种智能指针:unique_ptr、shared_ptr、weak_ptr。
另外还有一个auto_ptr目前已不推荐使用,原因是经常会误用其指针赋值功能(将指向的对象转移到赋值的指针下,之前的指针会指向NULL)造成内存错误。
其中:
unique_ptr声明的指针只能指向唯一的对象,不能赋值给其他指针,但可以使用move方法移动内存到另一个指针指向的内存里。当对象销毁时会释放其持有的堆内存。
shared_ptr表示该类型的指针变量可以共享内存对象,同时可以使用use_count来统计引用次数。
std::weak_ptr 表示指针不控制对象的生命周期,只用于访问对象。其目的是协助 std::shared_ptr 工作,构造和析构不会引起引用计数的增加或减少,可以解决shared_ptr 互相引用导致的死锁问题。该类型指针没有重载*和->运算符,但可以使用expired方法来判断weak_ptr的对象是否被释放。多应用于事件对象的声明中。

二、示例

#include<iostream>
#include <memory>
using namespace std;void test1()
{//1unique_ptr<int> p1(new int(1));cout << *p1 << endl;//2unique_ptr<int> p2;p2.reset(new int(2));cout << *p2 << endl;//3,make_unique方法是C++14开发的unique_ptr<int> p3 = make_unique<int>(3);cout << *p3 << endl;
}void test2()
{//1shared_ptr<int> p1(new int(1));cout << *p1 << endl;//use_count方法用于获取当前资源的引用计数cout << "use count: " << p1.use_count() << endl;//2shared_ptr<int> p2;p2.reset(new int(2));cout << *p2 << endl;//3shared_ptr<int> p3;p3 = make_shared<int>(3);cout << *p3 << endl;//4,可以拷贝和赋值p1的资源shared_ptr<int> p4(p1);cout << *p4 << endl;//use_count方法用于获取当前资源的引用计数cout << "use count: " << p4.use_count() << endl;shared_ptr<int> p5 = p1;cout << *p5 << endl;//use_count方法用于获取当前资源的引用计数cout << "use count: " << p5.use_count() << endl;
}void test3()
{//创建一个shared_ptr指针shared_ptr<int> p1(new int(1));cout << *p1 <<endl;//将shared_ptr指针拷贝给weak_ptr指针weak_ptr<int> p2(p1);cout << "use count: " << p1.use_count() << endl;//赋值weak_ptr<int> p3 = p1;cout << "use count: " << p1.use_count() << endl;
}int main()
{/*test1();*//*test2();*/test3();system("pause");return 0;
}

总结

使用智能指针需要注意其使用场合。声明不需共享的对象,使用unique_ptr,需要共享,则使用shared_ptr,需要的时候用,不需要的时候不用,可以使用weak_ptr。

C++总结笔记(十二)—— 智能指针相关推荐

  1. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:// ...

  2. 吴恩达《机器学习》学习笔记十二——机器学习系统

    吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...

  3. ROS学习笔记十二:使用roswtf

    ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...

  4. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  5. 【Visual C++】游戏开发笔记十二 游戏输入消息处理(一) 键盘消息处理

    相信大家都熟悉<仙剑奇侠传98柔情版>的人机交互方式,用的仅仅是键盘.在那个物质并不充裕的时代,一台配置并不高的电脑,一款名叫<仙剑奇侠传>的游戏,却能承载一代人对梦想的追逐. ...

  6. 强化学习经典算法笔记(十二):近端策略优化算法(PPO)实现,基于A2C(下)

    强化学习经典算法笔记(十二):近端策略优化算法(PPO)实现,基于A2C 本篇实现一个基于A2C框架的PPO算法,应用于连续动作空间任务. import torch import torch.nn a ...

  7. Polyworks脚本开发学习笔记(十二)-输出和读取文本文件

    Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...

  8. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

  9. python图像处理笔记-十二-图像聚类

    python图像处理笔记-十二-图像聚类 学习内容 这一章主要在学习的是聚类算法以及其在图像算法中的应用,主要学习的聚类方法有: KMeans 层次聚类 谱聚类 并将使用他们对字母数据及进行聚类处理, ...

  10. 软考-软件设计师 笔记十二(数据流图)

    本栏博客目录 软考-软件设计师 笔记一(计算机组成与体系结构) 软考-软件设计师 笔记二(操作系统基本原理) 软考-软件设计师 笔记三(数据库系统) 软考-软件设计师 笔记四(计算机网络) 软考-软件 ...

最新文章

  1. Postman 调试技巧
  2. 当技术面试官的一些心得
  3. 二叉平衡树算法c语言,算法9-9~9-12:平衡二叉树的基本操作 (C语言代码)
  4. leetcode 111
  5. 思科Catalyst1900交换机上速配VLAN
  6. 【WC2008】【BZOJ1271】秦腾与教学评估(二分,前缀和,奇偶性乱搞)
  7. 孙子兵法吃鸡之地形篇
  8. springmvc获取原生servletAPI
  9. python opencv 中文路径_解决python cv2.imread 读取中文路径的图片返回为None的问题
  10. 将日期格式格式化为XXXX/XX/XX
  11. ESP32产品系列之智能插座(二),ESP32代码部分
  12. 五笔打字 五笔练习 86编码 字根 五笔字典 拆字 图解
  13. 树莓派开发板入门学习笔记2:[转]树莓派系统在VM中能做什么
  14. #1992. 购票(ticket)
  15. matlab能否独立做程序,如何将MATLAB程序编译成独立可执行的程序
  16. js: 获取最近3天、1周、1个月、3个月、半年、1年的时间
  17. 精讲精练k-近邻算法:knn(一)
  18. 编程人士的探索之路(第二弹)
  19. Python寻求帮助
  20. 运维工作常见问题处理74-100(三)

热门文章

  1. Ubuntu下安装FTP服务及使用(VSFTPD详细设置)(二)
  2. Xss Csrf 简介
  3. ORACLE 各种闪回操作
  4. 看YYModel源码的一些收获
  5. NKU 专题一 题解
  6. ASP站点无法访问怎么办
  7. java日志之slf4j与logback简单使用
  8. 3D坦克大战游戏源码
  9. 《Two Days DIV + CSS》读书笔记——CSS选择器
  10. 链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链