我们使用 new关键字 或者 malloc函数 开辟一块空间时,因为这块空间是在堆上开辟的,如果不手动释放,即便出了作用域,这块空间也依然存在,这个时候就会造成内存泄漏。

为了保证资源的释放,我们可以使用智能指针。其实就是资源管理权限的转移,不想手动释放,交给一个对象管理,对象什么时候被销毁,这块资源也就什么时候被释放。


         目录

1、RAII特性

2、智能指针的底层实现

3、智能指针的使用


1、RAII特性

RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句 柄、网络连接、互斥量等等)的简单技术。

这种特性的关键在于构造函数和析构函数:

  • 构造函数:获取资源。比如拿到动态开辟的空间地址
  • 析构函数:对象出了作用域,会自动调用析构函数,可以在析构函数中释放这块资源

其实我们就是把这块资源的管理权转交给了一个对象,这种方式的好处是无需显式释放资源,资源在对象的生命周期内一直有效。

2、智能指针的底层实现

智能指针就是借用了 RAII 特性,只不过为了让其具备指针的行为,需要重载 * 、-> 两个运算符,让其像指针一样使用。

(1) RAII特性实现

RAII的特性主要体现在构造函数和析构函数,下面我们实现一个SmartPtr类

template<class T>
class SmartPtr
{
public:SmartPtr(T* ptr) :_ptr(ptr)          // 获取资源{}~SmartPtr() {if (_ptr){delete _ptr;    //  释放资源_ptr = nullptr;}}
private:T* _ptr;
};

(2) *、-> 运算符重载

// 重载运算符 *
T& operator*() {return *_ptr;
}// 重载运算符 ->
T* operator->() {return _ptr;
}

3、智能指针的使用

上述实现的只是智能指针最简单的功能,使用方法和标准库的智能指针类似。关于unique_ptr 和 shared_ptr,放在其他地方介绍。

int main()
{int* p1 = new int;SmartPtr<int> sptr(p1);                   // 上述自定义的SmartPtrunique_ptr<int> up(new int);         // 标准库中的unique_ptrshared_ptr<int> sp(new int);            // 标准库中的shared_ptrreturn 0;
}

智能指针(一)—— 智能指针的底层原理(RAII特性)相关推荐

  1. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】...

    Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...

  2. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】

    Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...

  3. ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析...

    Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...

  4. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

    Android系统的运行时库层代码是用C++来编写的,用C++来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本文 ...

  5. C++(9)--裸指针、智能指针、引用

    指针 1.裸指针的基本概念 1.1 裸指针的声明*/初始化& 1.2 操作裸指针--间接运算符* 1.3 裸指针使用 demo--指向一个简单变量 1.4 空指针--nullptr 1.5 特 ...

  6. Android 智能指针 视频,Android系统智能指针中轻量级指针

    lp.sp.wp在Android Native层中被大量使用,所以非常有必要学习它们的实现原理.lp是Light Pointer的缩写,表示轻量级指针,sp是Strong Pointer的缩写,表示强 ...

  7. Android基础知识之智能指针:强指针和弱指针

    Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),另外一种是弱指针(weak pointer).其实称之为强引用和弱引用更合适一些.强指针与一般意义的智能指针概 ...

  8. 【C++】初识智能指针:智能在哪?

    最近被指针折磨了一下,赶紧来学习一下智能指针,希望以后都可以用智能指针替换"裸指针",不要再自己去释放了. 一.什么是智能指针? 在说智能指针之前,先来看看"不智能指针& ...

  9. android 绘指针,Android智能指针

    "Yeah It's on. " 前言 在Android系统中,Native层的代码基本都是C++写的,C++跟Java不一样,C++没有垃圾回收机制,C++代码中难于管理new出 ...

最新文章

  1. stm32驱动lcd段码io配置_I.MX6U处理器GPIO的命名复用与IO配置
  2. 硕士本科论文通过matlab出仿真图
  3. 1.4 Java创建一个学生类
  4. Linux网络编程 之 套接字(四)
  5. tensorboard ckpt pb 模型的输出节点_算法工程化系列——模型固化
  6. AP 1532E register   Cisco 2504 AP注册WLC
  7. 互联网java面试_互联网java面试宝典
  8. milk and news paper(transfer)
  9. Process Node.js 进程
  10. 用自己的算法实现startsWith和endsWith功能
  11. 兄弟节点div, +~选择器不能向前选择
  12. talentcentral测评结果_人才测评报告
  13. 几种比较好用的连接PostgreSQL的客户端
  14. 项目管理十大知识领域之项目质量管理
  15. linux下mysql免安装_linux下免安装版本mysql5.5 配置
  16. matlab 分数阶的预估校正算法及实现
  17. 手把手从0打造电商平台前端
  18. Acme CAD Converter 的线宽要怎么设置啊
  19. 2019软科计算机中国排名,权威发布:2019软科中国最好学科排名
  20. 解决captcha验证码无法显示的问题

热门文章

  1. 如何修改3D模型的原子属性
  2. linux 实验感悟_linux实验心得体会
  3. 同构和异构关系图-行人re_ID
  4. iOS LeetCode ☞ Fizz Buzz
  5. docker容器搭建discuz论坛
  6. Jni native java.lang.UnsatisfiedLinkError:No implementation found for boolean com.xxx.xxx.jni.init()
  7. 微信小程序没有找到可以构建的NPM包,请确认需要参与构建的npm在miniprogramroot目录
  8. Python基础知识笔记
  9. 幸运大转盘(每天一个python小项目)
  10. 基础加强 -- 反射