C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
1、野指针的概念、成因以及避免
首先,来说说什么是野指针,所谓野指针就是一个指向未申请访问受限的内存区域或者已经删除了的对象的指针。
什么意思呢?就是本来一个指针指向一个对象、一块内存,但是由于程序(函数)运行结束对象(栈内存)被释放,从而
导致指针指向一个“垃圾”内存,注意,不能将NULL指针认为是野指针。因为野指针指向的是随机的一块内存地址。
成因:1)指针在声明时没有进行初始化;2)在释放指针所指的内存时,没有将指针置为NULL;3)返回值是栈内存的指针或者引用。
避免:很多网上的资料都说初始化指针为NULL,是一个良好的编程习惯,实际上这也是为了避免野指针的出现。当然如果你的指针是
static指针变量,那么它的初始值是不会随机的。
2、内存泄露
什么是内存泄露呢?所谓内存泄露,就是指动态分配的内存未释放或者无法释放,但是原本指向
这块内存的指针却失去了对这块内存的控制,导致内存的浪费。
成因:1)在使用完内存空间没有将其释放;2)非法访问内存空间,也就是说访问分配的内存中未进行初始化的变量;
避免:额,这个我也不知道具体怎么避免,网上有很多避免内存泄露的方法,这里就不做阐述了。(以后再补充)不过最近在使用集合类的时候出现过内存泄露,
当将其设为静态时,其生命周期与整个程序的生命周期是一样长的,因此容易出现内存泄露。
3、智能指针
智能指针使用引用计数的计数,也就是说智能指针类使用一个引用计数和类的一个对象关联,由引用计数去跟踪类的多个对象的指针,从而知道有多少个对象的指针指向同一个对象。
它其实是存储指向动态分配对象指针的类。
对于这个智能指针,我还没有进行深入的了解,只是知道在使用一些容易导致内存泄露、出现野指针的情况下,例如最近在写一个语音识别的项目时,使用COM接口指针时,可以使用智能指针。(日后进行深入时再补充)
若要释放一个智能指针,直接给它赋值为NULL即可。
C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)的更多相关文章
- C++三种野指针及应对/内存泄露
C++三种野指针及应对/内存泄露 野指针,也就是指向不可用内存区域的指针.如果对野指针进行操作,将会使程序发生不可预知的错误,甚至可能直接引起崩溃. 野指针不是NULL指针,是指 ...
- [Swift通天遁地]七、数据与安全-(11)如何检测应用程序中的内存泄露
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- C++的空指针、野指针和指针赋值NULL.md
1.空指针和野指针 http://blog.csdn.net/fu_zk/article/details/21030607 空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1( ...
- NULL指针、零指针、野指针
1.1.空指针 如果 p 是一个指针变量,则 p = 0; p = 0L; p = '\0'; p = 3 - 3; p = 0 * 17;p=(void*)0; 中的任何一种赋值操作之后, p 都成 ...
- 野指针、NULL指针和void*
一.野指针 “野指针”不是NULL指针,是指向“垃圾”内存的指针. “野指针”的成因主要有三种: (1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱 ...
- 浅谈 “空指针、野指针、void*”
Author: JW. Zhou Date: 2014/7/2 一.空指针(0/NULL) 返回NULL和返回0是完全等价的,因为NULL和0都表示空指针,换句话说:空指针是什么,就是 ...
- 浅谈C++的智能指针
我们使用智能指针来自动运行管理内存,避免对原始指针的使用不当而造成内存泄漏. ------------------------------------------------------------- ...
- 李洪强iOS开发之【Objective-C】09-空指针和野指针
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...
- 【Objective-C】4-空指针和野指针
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...
随机推荐
- win7下配置IIS
Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是Windows NT版本的可选 ...
- 【第十三章】 springboot + lombok
lombok作用:消除模板代码. getter.setter.构造器.toString().equals() 便捷的生成比较复杂的代码,例如一个POJO要转化成构建器模式的形式,只需要一个注解. 注意 ...
- 安卓开发 UI入门
布局的类型 线性布局 LinearLayout *** 垂直显示 vertical 水平显示 horizontal 文本适应 wrap_content 填充父窗体 match_parent 权重 l ...
- Ansible 操作windows
1.主控端安装ansible 1) pip install ansible 2.主控端安装相关的包 pip install http://github.com/diyan/pywi ...
- BZOJ 1015: [JSOI2008]星球大战starwar(并查集求连通块+离线处理)
http://www.lydsy.com/JudgeOnline/problem.php?id=1015 题意: 思路:好题啊!!! 这道题目需要离线处理,先把所有要删的点给保存下来,然后逆序加点,这 ...
- UVa 1631 密码锁
https://vjudge.net/problem/UVA-1631 题意: 有一个n位密码锁,每位都是0~9,可以循环旋转.每次可以让1~3个相邻数字同时往上或者往下转一格.输入初始状态和终止状态 ...
- MVC ---- 如何使用Predicate以及如何自定定义Predicate委托
微软公司提供只能返回bool值,接受一个参数的委托类型(Predicate). //Predicate委托 public static class PredicateDemo{ //内置方法 publ ...
- 【BZOJ】[HNOI2015]菜肴制作
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4010 要是考场上想不出,但是还是有一个分治的做法的嘛 做法就是反向连边,然后再反向输出字典 ...
- JavaScript页面跳转的一些实现方法
第一种 <script language=”javascript” type=”text/javascript”> window.location.href=”login.jsp?back ...
- gcc 编译出现 internal compiler error: Killed
系统没有交换分区, 编译过程中内存耗尽, 导致了编译中断 …解决方式也很简单, 就是增加一个交换分区: 创建分区文件, 大小 2G dd if=/dev/zero of=/swapfile ...