野指针与内存泄露
2016-03-31 20:04
113 查看
野指针的成因主要有两种
例如:
总结:
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 正常处理退出
}
(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 正常处理退出
}
相关文章推荐
- 格式化字符串
- HDOJ 2047-阿牛的EOF牛肉串【规律】
- viewpager
- 算法设计15-8签约棒球自由球员
- MySQL备份模式
- python 中文分词
- 地图坐标转换 -- 火星坐标与GPS坐标
- iOS开发:多线程技术概述
- JavaScript之DOM-6 BOM概述 、Window对象(Window对象概述、窗口与对话框、定时器)
- 除去链表中重复元素
- java反射机制
- Missing library: xdoclet-1.2.1.jar. Select the home directory for XDoclet. 1.2.1
- 蓝桥杯翻硬币
- html中dispaly 与 visibility的区别
- 关于xcode——滚动条
- ConcurrentHashMap原理分析
- VMware Workstation 12 OpenGL ES版本支持情况与设置
- nyoj 127 星际之门(一)
- thinkPHP3.2.3的多语言设置
- Windows下编译OpenSSL最新版(openssl-1.0.2a)