- 本文章为原创,欢迎交流,欢迎转载;转载请勿篡改内容,并且注明出处,谢谢!
本节重点介绍程序中各种内存错误及其原因:
空指针:
空指针一般定义为NULL, 即0; 现代操作系统都会保留从0开始的一块内存,一旦程序访问了这块内存,系统就会触发一个异常;
问题1: 为什么需要保留这样一块内存?
可以判断一个指针的有效性
问题2:为什么不只保留一个字节的内存呢?
一般内存管理都是按页进行管理的,无法单纯保留一个字节,至少保留一页,保留一页也有额外的好处,如检测诸如:
p = NULL; p[1]之类的内存错误
问题3:这块内存有多大?
不同的OS,这块区域大小是不一样的,一般是一页的大小
野指针:
是指已经被释放的内存地址值;
访问已经被释放掉内存,会引发系统异常,一般会导致程序crash;
被释放的内存可以被系统的内存分配器重新分配
内存访问越界:分为读越界和写越界
读越界:
读取不属于自己地址空间的内存,
后果:
若所读的内存地址是无效的,则程序crash; 若有效,由于读到的数据具有随机性,会产生不可预
知的后果;
写越界:(又称缓冲区溢出)
写不属于自己地址空间的内存
后果:
可能会破坏别人的内存区域,而且所写入的数据对别人而言是随机的,会产生不可预料的后果
引用未初始化的变量:
使用未初始化的变量,因为这些值是随机的,所以会产生不可预知的后果;
像VC一类的编译器会把它们初始化为固定值,如0XCC.
bug fixed 系列之四 : 内存错误分析解决
最新推荐文章于 2021-05-25 09:31:59 发布