关于内存泄露及野指针的一点小总结
2013-07-23 15:43
323 查看
内存泄露
关于内存泄露,就是在程序中,动态的分配了内存,却没有释放,以致整个程序中一直占据着那块内存,这样的情况就是内存泄露。当然,动态的分配内存都是在堆里申请的内存。
如果说是一般的小程序,不会造成重要的内存泄露问题,当程序比较大,内存没有及时的释放,内存长期占用,就会造成内存不足的情况,导致系统崩溃。
野指针
也是悬空指针,就是指针没有具体的指向。 野指针的成因有两种:
1)指针变量没有初始化。任何指针变量在没有初始化的情况下不会自动赋值为NULL,它的缺省值是随机的,所以,在指针变量创建时,要么赋值为NULL,要么指向一片合法的内存。
2)指针变量被delete或free后,没有赋值为NULL,误以为是合法的内存。if语句对它不起作用。
注意的一个问题是:不要返回指向栈的指针和引用。
free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。
关于内存泄露,就是在程序中,动态的分配了内存,却没有释放,以致整个程序中一直占据着那块内存,这样的情况就是内存泄露。当然,动态的分配内存都是在堆里申请的内存。
如果说是一般的小程序,不会造成重要的内存泄露问题,当程序比较大,内存没有及时的释放,内存长期占用,就会造成内存不足的情况,导致系统崩溃。
野指针
也是悬空指针,就是指针没有具体的指向。 野指针的成因有两种:
1)指针变量没有初始化。任何指针变量在没有初始化的情况下不会自动赋值为NULL,它的缺省值是随机的,所以,在指针变量创建时,要么赋值为NULL,要么指向一片合法的内存。
2)指针变量被delete或free后,没有赋值为NULL,误以为是合法的内存。if语句对它不起作用。
注意的一个问题是:不要返回指向栈的指针和引用。
#include <stdio.h> #include <stdlib.h> int main(){ char *p = (char *)malloc(100); strcpy(p,"hello world"); printf("%s\n",p);//打印的结果是hello world free(p);//释放内存 但是没有赋值 if(p!=NULL){ strcpy(p,"hell"); printf("%s\n",p);//打印结果是hell } return 0; }
free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。
相关文章推荐
- 关于CPU位数,OS位数以及内存大小关系的一点总结
- 关于java内存的一点总结
- 关于内存泄露的总结
- 关于局部指针的一点总结
- 关于局部指针的一点总结
- 关于内存泄露的一点实例
- 关于java处理内存泄露与内存溢出的学习总结
- C/C++ 段错误--关于指针内存泄露
- 关于函数指针的一点总结
- C中关于一位数组与指针和二维数组与指针的一点总结
- 关于内存泄露的一点心得
- 关于c++内存的一点总结20150603
- 关于java处理内存泄露与内存溢出的学习总结
- 看完了linux书第二章后,关于内存寻址的一点总结
- 关于java内存泄露的总结--引用的类型:强引用,弱引用,软引用
- 前两天困扰我的一个关于指针和内存的问题的总结
- C++内存泄露 与 野指针总结
- 关于指针运用的一点总结
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- Unity3D关于内存优化,内存泄露、多线程、引用C++的dll的问题研究