您的位置:首页 > 其它

野指针与内存泄露

2016-03-31 20:04 113 查看
野指针的成因主要有两种

(1)指针变量没有被初始化,任何指针变量刚被创建时不会自动生成NULL指针。它的默认值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存


例如:

char *p = NULL;
char *str = (char *)malloc(sizeof(char)* 100);


(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是一个合法的指针。别看free和delete的名字“恶狠狠的”(尤其是delete),它们只是把指针所指的内存给释放掉,但是并没有把指针本身给干掉,用调试器跟踪,发现p被free之后其地址仍然不变(非NULL),只是改地址对应的内存是垃圾,p成了野指针。如果此时不把p设置为NULL,会让人误以为p是一个合法的指针
如果程序比较长,我们有时记不住p所指向的内存是否已经被释放,在继续使用p之前,通常会用语句if(p!= NULL)进行防错处理,很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,也不指向合法的内存块


char *p = (char *)malloc(100);
strcpy(p, "hello");
free(p);                     //p所指向的内存被释放,但是p所指向的地址仍然不变
....
if (p != NULL)               //没有起到防错的效果
{
strcpy(p,"world");    //出错
}


总结:

野指针就是访问了不该访问的内存或者访问了已经释放的内存。一般的,只要我们在编写程序的时候养成良好的编程习惯就能避免野指针的出现


1、首先在定义指针的时候先把它定义为NULL(零地址) 原型:#define NULL (void *)0

零地址:

(1)不能访问零地址对应的内存空间

(2)不能修改0地址对应的内存空间的值

例: char * ptr = NULL;//只要有NULL则不能对*ptr取值,不能对零地址做赋值.

2、malloc之后要free。

free(ptr);

Ptr = NULL; //不加这句话的话,ptr还是一个野指针

3、if(ptr == NULL) 使用之前先判断

{

printf(”malloc error!\n“);

exit(1); //异常处理退出。Return 正常处理退出

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