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. 下面两个都是空指针 ...
随机推荐
- 64bit ubuntu如何使能安装32bit软件
答:使用一下命令即可: sudo dpkg --add-architecture i386
- 翻译header
!/usr/bin/env pyhton --coding:utf-8-- import urllib.request import urllib.parse import os,sys import ...
- dos与unix系统的格式转化
unix 只用\n作为行结束符,而在 dos中是以\r和\n作为行结束符, 如果一个文件是在unix系统下创建,然后想在dos下使用,就要用unix2dos,如 unix2dos file 如果一个文 ...
- 精通移动app测试实战
- MAC下安装npm和node
Step1: 在官网下载适合mac的版本的nodejs,官网地址https://nodejs.org/en/ Step2: 上述方法我试了,但是不管用.安装完毕且重启均不能显示我安装的版本.哭 下面重 ...
- MongoDB(课时4 数据增加)
3.4 数据操作(重点) 只要是数据库就绝对离不开最核心的功能:CRUD(增加Create.读取查询Retrieve.更新Update.删除Delete),除了增加之外,其他都很麻烦,最麻烦的是修改. ...
- 证明: 2^0+2^1+2^2+2^3+.+2^n-1=(2^n)-1
S=2^0+2^1+2^2+2^3+.+2^(n-1)2S=2^1+2^2+2^3+...+2^(n-1)+2^n两式相减,2S-S=2^n-2^0S=2^(n)-1
- iconfont使用方法
最近才发现一种新的iconfont的使用方法 http://www.iconfont.cn/ 经常使用的图标放在一个项目里 需要关注的几点: 使用方法有三种方式unicode , font clas ...
- Python map/reduce
2017-07-31 18:20:59 一.map函数 map():会根据提供的函数对指定序列做映射.第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 ...
- java 路径分隔符File.separator 以及 路径两种写法"/"和"\\"
一.File.separator File file=new File(); 这句是新建一个文件.file.separator这个代表系统目录中的间隔符,说白了就是斜线,不过有时候需要双线,有时候是单 ...