bug fixed 系列之四 : 内存错误分析解决

来源:互联网 发布:星光璀璨海选网络直播 编辑:程序博客网 时间:2024/06/05 00:14
    本文章为原创,欢迎交流,欢迎转载;转载请勿篡改内容,并且注明出处,谢谢!

    本节重点介绍程序中各种内存错误及其原因:

    空指针:

    空指针一般定义为NULL,0现代操作系统都会保留从0开始的一块内存,一旦程序访问了这块内存,系统就会触发一个异常; 

    问题1为什么需要保留这样一块内存?

                可以判断一个指针的有效性

    问题2:为什么不只保留一个字节的内存呢?

               一般内存管理都是按页进行管理的,无法单纯保留一个字节,至少保留一页,保留一页也有额外的好处,如检测诸如:

                p = NULL; p[1]之类的内存错误

    问题3:这块内存有多大?

               不同的OS,这块区域大小是不一样的,一般是一页的大小


    野指针:

    是指已经被释放的内存地址值;

    访问已经被释放掉内存,会引发系统异常,一般会导致程序crash

    被释放的内存可以被系统的内存分配器重新分配


    内存访问越界:分为读越界和写越界

    读越界:

           读取不属于自己地址空间的内存,

    后果:

           若所读的内存地址是无效的,则程序crash若有效,由于读到的数据具有随机性,会产生不可预

          知的后果;

    写越界:(又称缓冲区溢出)

          写不属于自己地址空间的内存

    后果:

          可能会破坏别人的内存区域,而且所写入的数据对别人而言是随机的,会产生不可预料的后果


    引用未初始化的变量:

    使用未初始化的变量,因为这些值是随机的,所以会产生不可预知的后果;

    VC一类的编译器会把它们初始化为固定值,如0XCC.


0 0