智能指针(一)—— 智能指针的底层原理(RAII特性)
我们使用 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特性)相关推荐
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】...
Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】
Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...
- ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析...
Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析
Android系统的运行时库层代码是用C++来编写的,用C++来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本文 ...
- C++(9)--裸指针、智能指针、引用
指针 1.裸指针的基本概念 1.1 裸指针的声明*/初始化& 1.2 操作裸指针--间接运算符* 1.3 裸指针使用 demo--指向一个简单变量 1.4 空指针--nullptr 1.5 特 ...
- Android 智能指针 视频,Android系统智能指针中轻量级指针
lp.sp.wp在Android Native层中被大量使用,所以非常有必要学习它们的实现原理.lp是Light Pointer的缩写,表示轻量级指针,sp是Strong Pointer的缩写,表示强 ...
- Android基础知识之智能指针:强指针和弱指针
Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),另外一种是弱指针(weak pointer).其实称之为强引用和弱引用更合适一些.强指针与一般意义的智能指针概 ...
- 【C++】初识智能指针:智能在哪?
最近被指针折磨了一下,赶紧来学习一下智能指针,希望以后都可以用智能指针替换"裸指针",不要再自己去释放了. 一.什么是智能指针? 在说智能指针之前,先来看看"不智能指针& ...
- android 绘指针,Android智能指针
"Yeah It's on. " 前言 在Android系统中,Native层的代码基本都是C++写的,C++跟Java不一样,C++没有垃圾回收机制,C++代码中难于管理new出 ...
最新文章
- stm32驱动lcd段码io配置_I.MX6U处理器GPIO的命名复用与IO配置
- 硕士本科论文通过matlab出仿真图
- 1.4 Java创建一个学生类
- Linux网络编程 之 套接字(四)
- tensorboard ckpt pb 模型的输出节点_算法工程化系列——模型固化
- AP 1532E register Cisco 2504 AP注册WLC
- 互联网java面试_互联网java面试宝典
- milk and news paper(transfer)
- Process Node.js 进程
- 用自己的算法实现startsWith和endsWith功能
- 兄弟节点div, +~选择器不能向前选择
- talentcentral测评结果_人才测评报告
- 几种比较好用的连接PostgreSQL的客户端
- 项目管理十大知识领域之项目质量管理
- linux下mysql免安装_linux下免安装版本mysql5.5 配置
- matlab 分数阶的预估校正算法及实现
- 手把手从0打造电商平台前端
- Acme CAD Converter 的线宽要怎么设置啊
- 2019软科计算机中国排名,权威发布:2019软科中国最好学科排名
- 解决captcha验证码无法显示的问题
热门文章
- 如何修改3D模型的原子属性
- linux 实验感悟_linux实验心得体会
- 同构和异构关系图-行人re_ID
- iOS LeetCode ☞ Fizz Buzz
- docker容器搭建discuz论坛
- Jni native java.lang.UnsatisfiedLinkError:No implementation found for boolean com.xxx.xxx.jni.init()
- 微信小程序没有找到可以构建的NPM包,请确认需要参与构建的npm在miniprogramroot目录
- Python基础知识笔记
- 幸运大转盘(每天一个python小项目)
- 基础加强 -- 反射