您的位置:首页 > 其它

野指针及其有效的避免方法

2016-07-16 16:30 211 查看
野指针的生成及其产生的原因

一,指向不确定地址的指针变量。(即没有初始化)使用野指针易因内存泄露出现段错误。而造成内存泄露的原因有两个:

1,访问了没有权限的内存,如果正确使用指针,系统会给指针分配相应的内存空间,

如果指针指向了的内存不是系统分配的,则判定为没有权限。

2,访问了已经释放的内存。

二,指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。

 
    指针p被free或delete以后其地址仍然不变(非NULL),只是该地址对应的内存       是垃圾,p成了“野指针”,


三,指针操作超越了变量的作用范围

如何有效的避免的野指针的出现

1,当一个指针没有指向时,我们一般默认指向NULL。(NULL代表内存的0地址,并且NULL是不允许做任何操作的)

            char * buf = new char[128];

 
          char * buf1 = buf;
            delete buf;

 
          buf = NULL;

可以养成编程好习惯,在每次用完指针时,将其删除(比如多用new和delete),并置0。(buf
= NULL)

原因:buf放在栈里,而他所指的对象放在自由存储区,调用了free或者是delete之后,我们只是把自由存储区的空间释放掉了,但是对于buf,他会一直维持到他的作用域结束,然后由函数本身(或者是调用者,这取决于函数的申明方式)进行清理,所以你一旦delete之后,立刻把它置0(buf = NULL;),让他指向内存地址中不存在的地址空间,那么,我们以后一旦不小心再次使用他,我们在编译阶段就可以得到错误信息,从根本上杜绝了“野指针错误”,不会意外得改动数据,甚至导致系统出错。

二,使用malloc分配内存。(在堆空间里分配内存)

     #difine  MAX_SIZE  1024;

        char *ptr = (char *) maollc  (sizeof (char) * MAX_SIZE);

malloc的使用依照下面的流程:

1.分配内存。(分配成功,返回内存的首地址;分配不成功,返回NULL)。

2.检查是否分配成功(若失败,则  exit(1) 退出程序)。

3.清空内存中的数据 (malloc分配的空间里可能存在垃圾值,因此我们需要清空,可以用到memset或bzero 函数)。

4.使用内存。

5.释放内存(free,这时ptr又变成野指针)。

6.写成NULL。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: